http://www.searchtb.com/2013/07/jvm-gc-introduction-examples.html
http://my.oschina.net/luffyke/blog/111442
非常重要:
官方文档:虚拟机选项
-Xmx1024k
-Xmx512m
-Xmx8g
-XX:MaxPermSize=64m
-XX:MaxNewSize=size
-XX:NewSize=2g 新生代大小
-XX:ThreadStackSize=512 线程栈大小(kb)
-Xms1g 初始化内存总大小
-Xmx1g 最大内存总大小
-Xmn100m 新生代大小
-Xmn2048m
新生代内存有3中设置方法:
(1)最高优先级: -XX:NewSize=1024m和-XX:MaxNewSize=1024m
(2)次高优先级: -Xmn1024m (默认等效效果是:-XX:NewSize==-XX:MaxNewSize==1024m)
(3)最低优先级:-XX:NewRatio=2
MEM_ARGS=”-Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:SurvivorRatio=6”
在上面的例子中:
YOUNG+OLD: 512M
YOUNG: 256M
Perm: 128M
Eden: YOUNG*6/(6+1+1)=192M
Survivor: YOUNG/(6+1+1)=32M
Java堆的总尺寸=YOUNG+OLD+Perm=640M
基本原理
常用参数
常用:
-server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC \
-XX:-CMSConcurrentMTEnabled -XX:CMSInitiatingOccupancyFraction=70 \
-XX:+CMSParallelRemarkEnabled \
-XX:+UseCMSCompactAtFullCollection \
-XX:MaxDirectMemorySize=512m \
-XX:OnOutOfMemoryError="kill -9 %p" \
-XX:+AggressiveOpts \
-Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 \
-Duser.language=zh -Duser.region=CN
-XX:OnOutOfMemoryError="kill -9 %p"
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/tmp
JVM_ARGS="-Xms1536m -Xms1536m -XX:OnOutOfMemoryError='kill -9 %p'"
JOPTS="-server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC \
-XX:-CMSConcurrentMTEnabled -XX:CMSInitiatingOccupancyFraction=70 \
-XX:+CMSParallelRemarkEnabled \
-XX:+UseCMSCompactAtFullCollection \
-XX:MaxDirectMemorySize=512m \
-Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 \
-Duser.language=zh -Duser.region=CN"
hbase中:
"$JAVA" -XX:OnOutOfMemoryError="kill -9 %p" $JAVA_HEAP_MAX $HBASE_OPTS -classpath "$CLASSPATH" $CLASS "$@"
-XX:+DisableExplicitGC 可能会触发 Direct ByteBuffer 的oom,可以用 -XX:+ExplicitGCInvokesConcurrent 或 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 优化
常用GC
-XX:+UseConcMarkSweepGC 并发标记清除。它是对年老代进行垃 圾收集 的。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器一样。
-XX:+UseParallelGC 年轻代,多线程并发,默认cpu核数,-XX:ParallelGCThreads=n 。对于年老代使用单线程。
-XX:+UseParallelOldGC
-XX:+UseSerialGC 使用简单的标记、清除、压缩方法对年轻代和年老代进行垃圾回收。线性,单线程。
-XX:+UseG1GC 不区分年轻代和年老代空间。它把堆空间划分为多个大小相等的区域。当进行垃圾收集时,它会优先收集存活对象较少的区域。
- -XX:MaxGCPauseMillis=200 最大GC停顿时间,建议值。也可以不设置。
- 不要设置年轻代的大小
http://developer.51cto.com/art/200907/138943.htm
http://www.oracle.com/technetwork/articles/java/g1gc-1984535.html-XX:+AggressiveOpts 使用带有试验性质的gc特性
-XX:+ParallelRefProcEnabled 以多线程方式探测弱引用
参数
-XX:+UseGCOverheadLimit
如果垃圾回收耗费了98%的时间,但是回收的内存还不到2%,那么JVM会认为即将发生OOM,让程序提前结束。
-XX:-UseGCOverheadLimit 关闭特性
-XX:OnOutOfMemoryError=”kill -9 %p”
-XX:MaxDirectMemorySize
Java状态检查
jstat
统计工具
jstat -gcutil pid 时间间隔 (毫秒)
jstat -gc 16136
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
1024.0 1024.0 0.0 0.0 8192.0 2867.9 10240.0 0.0 21248.0 2637.2 0 0.000 0 0.000 0.000
S0C,S1C,S0U,S1U: 0/1幸存区(survivor)容量(C:Capacity)/使用量(U:Used)。
EC,EU: Eden(伊甸)区容量/用量
按照复制算法的原理将新生代分成了3个区域:Eden、Survivor0、Survivor1。
OC,OU: Old(老生代)容量/用量。老生代常用的垃圾收集器有CMS、Serial Old、Parallel Old等
PC,PU: Perm(永生代)容量/用量。
YGC/YGCT: Young GC次数和总耗费时间。
FGC/FGCT:Full GC次数和总耗费时间。
GCT:GC总耗时。
SurvivorRatio 新生代中eden的比例,如果设置为8,意味着新生代中eden占据80%的空间,两个survivor分别占据10%
java -XX:+PrintFlagsFinal -version 2>&1 | grep MaxHeapSize
打印默认值
JConsole
使用JVM的可扩展性Java管理扩展(JMX)工具来提供关于运行于Java平台的应用程序的性能和资源消耗的信息。
需要使用-Dcom.sun.management.jmxremote java6开始不再需要
但需要com.sun.management.jmxremote.port=portNum
http://hornetblog.sinaapp.com/?p=5 比较全的
http://docs.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenl 如何配置远程JMX
启动远程jmx默认会需要密码和访问文件,可以使用
com.sun.management.jmxremote.authenticate=false来取消验证
com.sun.management.jmxremote.ssl=false 默认开启,需要显式取消
hadoop中启动,先设置
HADOOP_OPTS=”-Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false”
启动后远程监控
192.168.22.30:1111
jinfo
jmap
jmap -dump:live,format=b,file=heap.dmp PID 生成堆文件
jmap -heap PID Heap内存信息
jhat
内存堆分析工具
jmap导出后的映像文件可以用jhat来进行分析,
jhat -J-mx768m -port <端口号:默认为7000> heap.dmp
jmap -dump:live,format=b,file=heap.dmp 7550
Java内存占用
JVM
OS链接库存放空间
应用程序二进制码,即java classes
Java heap,对象存放在这个区域,这是一个必须连续的空间
经过JIT技术编译的本地代码存放空间
本地代码的heap
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com