Java的堆内存分为三部分
Java的垃圾回收分为两种
回收新生代中的对象,代价低,速度快
回收旧生代和持久代中的对象,代价高,速度慢
通过指定Java命令行参数可以改变内存和垃圾回收的行为。最常见的有
-Xmx1024m: 指定最大的堆大小为1024m
-Xms1024m: 指定初始化堆大小为1024m,设为跟最大的堆大小,可避免JVM动态调整
-XX:NewRatio=3: 指定新生代和旧生代的比例为1:3,比例越大,新生代越小,Minor GC调用越频繁,Full GC调用越不频繁。
-verbose:gc : 在控制台打印GC信息
-XX:+PrintGCDetails:显示更详细的GC信息
-Xloggc:gc.log :输出gc LOG到文件
JVisualVM是Java自带的工具,可以显示heap的变化趋势,更好的是通过visualgc这个插件来显示各个代的具体变化趋势。
jstat也是Java自带的一个分析工具。可以使用命令jstat –gcutil 来显示。
S0/S1/E/O/P-分别代表SO/S1/Eden/旧生代/永久代的大小
YGC/YGCT-代表minor gc的次数和时间
FGC/FGCT-代表full gc的次数和时间
GCT-代表GC的时间
tip:Pid可以通过jps命令来查到
Dump分析适用于那些需要详细了解heap的分配情况,可以具体到哪个类
jmap+jhat/Eclipse Memory Analyzer
jmap -dump:format=b,file=filename
jhat
默认启动在7000端口,可以用浏览器打开localhost:7000
有时候,我们希望在自己的程序中检测当前memory的使用情况
1
2
3
4
5
6
7
|
MemoryMXBean aMemoryMXBean=ManagementFactory.getMemoryMXBean();
MemoryUsage heapMemoryUsage=aMemoryMXBean.getHeapMemoryUsage();
usedHeapMemory = heapMemoryUsage.getUsed();
maxHeapMemory = heapMemoryUsage.getMax();
|
1
2
3
4
5
|
freeMemory= Runtime.getRuntime().freeMemory();
totalMemory=Runtime.getRuntime().totalMemory();
maxMemory=Runtime.getRuntime().maxMemory();
|