读懂GC日志
(1)代码:
public class Main {
public static void main(String[] args) {
TestClass testClass = new TestClass();
testClass.localvar1();
testClass.localvar2();
}
}
class TestClass {
public void localvar1() {
byte[] a = new byte[6*1024*1024];
System.gc();
}
public void localvar2() {
byte[] a = new byte[6*1024*1024];
a = null;
System.gc();
}
}
(2)编译代码生成class文件,使用java -XX:PrintGC Main
参看垃圾回收情况
注:使用参数-Xloggc:log/gc.log
可将gc日志保存到log/gc.log
中
以上每行代表一次垃圾回收,GC代表部分收集(比如只对新生代收集);Full GC代表收集整个堆。
以[GC (System.gc()) 8140K->6904K(125952K), 0.0074996 secs]
为例:
GC前堆使用的内存大小是8140K
;GC后堆使用的内存大小是6904K
;即释放的内存大小为8140K - 6904K
;当前可用的堆空间总和为125952K
.
类加载/卸载的跟踪
使用java -verbose:class Main
查看类的加载和卸载;等价于java -XX:+TraceClassLoading Main和java -XX:+TraceClassUnloading Main
虚拟机参数设置
(1)堆内存
-Xms
:初始堆内存大小
-Xmx
:最大堆内存大小
(2)栈内存
-Xss
:线程栈大小
(3)直接内存
-XX:MaxDirectMemory
:直接内存的最大值(默认最大等于堆内存的最大值)
虚拟机的工作模式:Client和Server
Server启动慢,但是该模式的执行速度远远快于Client模式;
两种模式的默认jvm参数有所不同