JVM常用参数(内存分配 内存回收日志)
内存监控
-verbose:gc


测试代码
public static void main(String[] args){
List<Classes> classes=new ArrayList<Classes>();
int count=0;
for(int i=0;true;i++){
classes.add(new Classes());
if(classes.size()>10000){
count++;
classes.clear();
classes=new ArrayList<Classes>();
System.out.println("标记为可回收");
}
if(count>20){
break;
}
}
}

1253K表示为回收前占用内存 903k表示回收后占用内存 可以发现标记回收后垃圾对象被成功回收, 3584为总内存 最后一个为回收时间
GC (Allocation Failure 表示为新生代回收
如果我们不标记为可回收会怎么样

因为没有标记为已回收 新生代from to 迭代15次或者满了以后直接放到老年代 循环多次后老年代内存快满了时触发fullGC 因为都没有标记为可回收所以每次回收后 占用内存没有变化 最终导致内存溢出
-XX:+PrintGCDetails
-XX:+PrintGCDetails
打印每次gc的回收情况 程序运行结束后打印堆空间内存信息(包含内存溢出的情况)

[PSYoungGen: 512K->400K(1024K)] 表示年轻代占用空间 回收前和回收后
512K->400K(1536K) 表示为java堆的空间总内存的回收签回收后内存
PsYoungGen 为新生代 总内存(total1024k ) 使用(used 462K) 其中:
eden区 512K
from区 512K
to区 521K
年轻代可用空间为1024可以发现eden+from+to大于1024 新生代的内存为eden+from或者+to 因为年轻代采用复制算法 所以复制区域会有一块儿重复的区域512 不能使用
ParOldGen 为老年代 总空间512K
Metaspace PermGen永久代废弃 jdk8使用 Metaspace(元空间) 替代
-XX:+PrintGCTimeStamps

打印每次gc的间隔的时间戳 full gc为每次对新生代老年代以及整个空间做统一的回收 系统中应该尽量避免
产生fullgc的几种情况 老年代空间不足 持久代(元空间 或者jdk8的元空间)空间不足 手动调用system.gc 可以使用可以DisableExplicitGC来禁止
-XX:+TraceClassLoading
打印类加载情况

-XX:+PrintClassHistogram
打印每个类的实例的内存占用情况
通过按ctrl+Break 会打印 用的mac不知道咋么按 哈哈哈
-XX:+PrintHeapAtGC
打印每次gc前后的内存情况

回收前年轻代eden区使用100% 老年代使用0% 回收后 eden区放到from区 老年代使用14%
Xloggc
配合上面的使用将上面的日志打印到指定文件
-Xloggc:/Users/liqiang/Desktop/logs/log.log
-XX:HeapDumpOnOutOfMemoryError
发生内存溢出将堆信息转存起来 以便分析

-XX:HeapDumpPath为转存位置 生成的文件使用JProfiler 打开 分析
也可以在内存溢出时执行脚本 比如发送邮件给系统管理员脚本
-XX:OnOutOfMemoryError ="sh ~/cleanup.sh"
内存分配参数
-Xmx -Xms 堆的最大内存和最小内存(最小内存为初始内存 ,如果满了将不断扩容到最大内存)默认是物理内存的1/64
-Xmx20m -Xms20m 则固定堆空间为20m(年轻代+老年代)
-XX:SurvivorRatio Survivor(from-to)区和eden区的占比
例如 -XX:SurvivorRatio=5 则是5:1:1
-XX:SurvivorRatio=8:则是8:1:1


2560*(2/7) 则是from和to的大小 剩下则是eden区的大小
-XMmn 设置新生代的大小 (绝对值)
如 -Xmn2m 则设置新生为2m
-XX:NewRatio 新生代占老年代的比例
如果是4 则是1:4 如果是5则为1:5 默认为2
如:


虽然新生代空间为2m但是2m通过计算eden和from to的的空间 但是真实新生代则是 eden+from或者to
-XX:PermSize -XX:MaxPermSize 设置永久代的值和最大值
因为jdk8之后溢出了永久代 使用元空间代替
MaxMetaspaceSize 元空间大小受制于操作系统内存
官方推荐堆空间内存分配
新生代占堆的3/8 幸存代占新生代的1/10
栈空间内内存分配
-Xss
栈空间是保存变量的地址 所以栈空间的大小决定了方法调用的深度 。比如递归方法会产生大量的变量

设置栈大小为108k 运行 几秒后栈溢出

则报栈溢出
我们如果我们将参数改为10m 则会等很久才会内存溢出
内存分配参数默认值
Xms 默认情况下堆内存的64分之一
-Xmx 默认情况下对内存的4分之一
-Xmn 默认情况下堆内存的64分之一
-XX:NewRatio 默认为2
-XX:SurvivorRatio 默认为8
jdk永久代大小设置 -XX:PermSize=64M -XX:MaxPermSize=128M
避免Concurrent Mode Failure
年老代剩余空间>=EDEN+SURVIROR,即:
(Xmx-Xmn)*(1-CMSInitiatingOccupancyFraction/100)>=(Xmn-Xmn/(SurvivorRatior+2))
Minor GC、Major GC和Full GC之间的区别
Minor GC
新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具
备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。一般感知不到
Major GC/Full GC
老年代回收 一般会至少伴随一次Minor GC MajorGC 的速度一般会比 Minor GC 慢 10
倍以上。
JVM常用参数(内存分配 内存回收日志)的更多相关文章
- 最简单例子图解JVM内存分配和回收
一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分 ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- 最简单例子图解JVM内存分配和回收(转)
本文转自http://ifeve.com/a-simple-example-demo-jvm-allocation-and-gc/ http://www.idouba.net/a-simple-exa ...
- JVM内存分配与回收
1.内存分配与回收策略 内存自动管理:自动化的解决了对象内存分配和回收对象内存的问题. 一般在堆上分配对象,也可能经过JTI编译后间接在栈上分配. 主要分配在新生代的Eden区,如果启动了本地线程分配 ...
- JVM垃圾回收器、内存分配与回收策略
新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...
- JVM学习十 -(复习)内存分配与回收策略
内存分配与回收策略 对象的内存分配,就是在堆上分配(也可能经过 JIT 编译后被拆散为标量类型并间接在栈上分配),对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定 ...
- Java深入 - Java 内存分配和回收机制
Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收. Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC ...
- Java深入 - Java 内存分配和回收机制-转
Java的GC机制是自动进行的,和c语言有些区别需要程序员自己保证内存的使用和回收. Java的内存分配和回收也主要在Java的堆上进行的,Java的堆中存储了大量的对象实例,所以Java的堆也叫GC ...
- Android的内存分配与回收
想写一篇关于android的内存分配和回收文章的想法来源于追查一个魅族手机图片滑动卡顿问题,我们想了很多办法还是没有避免他不停的GC,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ...
- Java 对象内存分配与回收
JVM内存区域模型: * 程序计数器,内存区域极小,是当前线程的字节码执行行号指示器: * 虚拟机栈.本地方法栈,即平时所说的“栈”,是虚拟机用来执行方法(包括Java.非Java方法)时,使用的临时 ...
随机推荐
- 蒟蒻的数位DP专题总结
BZOJ 1026: [SCOI2009]windy数: 题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 d ...
- Middle-help 终极实现元素水平垂直居中
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Android内存解析(一)—从Linux系统内存逐步认识Android应用内存
总述 Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉.所以在android开发时,管理好内存的 ...
- nyoj--990--蚂蚁感冒(模拟)(思维题)
蚂蚁感冒 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/ ...
- Python 网络爬虫与信息获取(二)—— 页面内容提取
1. 获取超链接 python获取指定网页上所有超链接的方法 links = re.findall(b'"((http|ftp)s?://.*?)"', html) links = ...
- C语言实现字符串拼接
#include <stdio.h>#include <stdlib.h>#include <string.h> char* str_contact(const c ...
- 洛谷P1894 [USACO4.2]完美的牛栏The Perfect Stall(二分图)
P1894 [USACO4.2]完美的牛栏The Perfect Stall 题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星 ...
- Gym - 101981K The 2018 ICPC Asia Nanjing Regional Contest K.Kangaroo Puzzle 暴力或随机
题面 题意:给你1个20*20的格子图,有的是障碍有的是怪,你可以每次指定上下左右的方向,然后所有怪都会向那个方向走, 如果2个怪撞上了,就融合在一起,让你给不超过5w步,让所有怪都融合 题解:我们可 ...
- python-day4 运算符,if判断, for循环
1.运算符 算术运算符 + - * / % 赋值运算符 = += -= 比较运算符 == < <= > >= != 逻辑 ...
- go的常量与变量
一.常量 1.1 定义 常量使用关键字const 定义,用于存储不会变化的数据 定义方法 const identifier [type] = value package main // 常量定义 co ...