1、Trace跟踪参数
1.1 关于GC的参数配置
-XX:+printGC 打印GC的简要信息
-XX:+PrintGCDetails 打印GC的详细信息
-XX:+PrintGCTimeStamps 打印CG发生的时间戳
-Xloggc:log/gc.log 指定GC log的位置
-XX:+PrintHeapAtGC 每一次GC前和GC后,都打印堆信息。
1.2 关于GC日志的解释
[GC[DefNew: 4416K->0K(4928K), 0.0001897secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00,real=0.00 secs]
上方日志的意思是说:这是一个新生代的GC。方括号内部的“4416K->0K(4928K)”含义是:“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。而在方括号之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”。再往后看,“0.0001897 secs”表示该内存区域GC所占用的时间,单位是秒。
上图中,我们先看一下用红框标注的“[0x27e80000, 0x28d80000, 0x28d80000)”的含义,它表示新生代在内存当中的位置:第一个参数是申请到的起始位置,第二个参数是申请到的终点位置,第三个参数表示最多能申请到的位置。上图中的例子表示新生代申请到了15M的控件,而这个15M是等于:(eden space的12288K)+(from space的1536K)+(to space的1536K)。
2、关于java堆的参数设置
2.1 关于java堆的参数配置
-Xmx –Xms 指定最大堆和初始堆
-Xmn 设置新生代大小
-XX:NewRatio 老年代(不包含永久区)和新生代(eden+2*s)的比值
-XX:SurvivorRatio(幸存代) eden区和Survivor的比值
SurvivorRatio的默认值为8,言外之意就是Edon和Survivor的比例是8:1:1。
不同的堆分布情况,对系统执行会产生一定的影响,基本策略:尽可能将对象预留在新生代减少老年代的GC次数
2.2 关于堆溢出的处理参数配置
-XX:+HeapDumpOnOutOfMemoryError OOM(堆溢出)时导出整个堆信息到文件根据这个文件,我们可以看到系统dump时发生了什么。
-XX:+HeapDumpPath 可以设置导出堆信息的路径
3、关于方法区的参数设置
-XX:PermSize 设置永久区的初始空间
-XX:MaxPermSize 设置永久区的最大空间。
也就是说,jvm启动时,永久区一开始就占用了PermSize大小的空间,如果空间还不够,可以继续扩展,但是不能超过MaxPermSize,否则会OOM(内存溢出)。
如果堆空间没有用完也抛出了OOM,有可能是永久区导致的。堆空间实际占用非常少,但是永久区溢出一样抛出OOM。
4、关于java栈的参数设置
-Xss 设置栈空间的大小。通常只有几百K
决定了函数调用的深度
每个线程都有独立的栈空间
局部变量、参数分配在栈上
5、JVM Server模式与client模式
5.1 JVM Server模式与client模式
我们的jdk完成安装后,在命名行输入java -version不仅可以看到jdk版本相关信息,还会看到类似与 Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode) 这样的信息。其中有个Server VM (build 25.31-b07, mixed mode)其实代表了JVM的Server模式了。当然JVM还有一个Client模式。
5.2 JVM Server模式与client模式启动的差别?
最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是:当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器, 而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器. C2比C1编译器编译的相对彻底,服务起来之后,性能更高.所以通常用于做服务器的时候我们用服务端模式,如果你的电脑只是运行一下java程序,就客户端模式就可以了。即使服务器模式编译更彻底,垃圾回收优化更好,这当然吃的内存要多点相对于客户端模式。