原文地址:http://www.spnguru.com/2010/08/java内存和垃圾回收无废话手册-2/
概念
Java的堆内存分为三部分
- 新生代(New Generation) – 新创建的对象(又分为S0,S1和Eden)
- 旧生代 (Old Generation) – 经过多次垃圾回收没有被回收的对象或者大对象
-
持久代 (Permanent Generation) – JVM使用的内存,包含类信息等
Java的垃圾回收分为两种
-
Minor GC
回收新生代中的对象,代价低,速度快
-
Full GC
回收旧生代和持久代中的对象,代价高,速度慢
配置
通过指定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+VisualGC插件
JVisualVM是Java自带的工具,可以显示heap的变化趋势,更好的是通过visualgc这个插件来显示各个代的具体变化趋势。
命令行:jstat
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分析
Dump分析适用于那些需要详细了解heap的分配情况,可以具体到哪个类
jmap+jhat/Eclipse Memory Analyzer
jmap用于dump heap信息到文件
jmap -dump:format=b,file=filename
jhat用于分析dump文件
jhat
默认启动在7000端口,可以用浏览器打开localhost:7000
Eclipse Memory Analyzer是Eclipse的一个插件,相当强大,推荐使用,可以帮你做leak analysis,注意的是它默认排除掉unreachable objects
编程
有时候,我们希望在自己的程序中检测当前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();
|