jvm

  1. 基本原理
  2. 常用参数
  3. 常用GC
  4. 参数
  5. Java状态检查
    1. jstat
    2. JConsole
    3. jinfo
    4. jmap
    5. jhat

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内存占用

  1. JVM

  2. OS链接库存放空间

  3. 应用程序二进制码,即java classes

  4. Java heap,对象存放在这个区域,这是一个必须连续的空间

  5. 经过JIT技术编译的本地代码存放空间

  6. 本地代码的heap


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com

💰

×

Help us with donation