Jvm运行时区域
Jvm内存结构
==============================================================================
-Xms2048m,初始堆大小,建议<物理内存的1/4,默认值为物理内存的1/64----
-Xmx2048m,最大堆大小,建议与-Xms保持一致,默认值为物理内存的1/4
-Xmn512m,新生代大小,建议不超过堆内存的1/2
-Xss256k,线程堆栈大小,建议256k
-XX:PermSize=256m,永久代初始值,默认值为物理内存的1/64
-XX:MaxPermSize=256m,永久代最大值,默认值为物理内存的1/4
-XX:SurvivorRatio=8:年轻带中Eden区和Survivor区的比例,默认为8:1,即Eden(8),From Space(1),ToSpace(1)
-XX:+UseConcMarkSweepGC: 开启CMS垃圾回收
-XX:MaxTenuringThreshold=15:晋升到老年代的对象年龄,每个对象坚持过一次MinorGC后对象年龄+1,默认值是15,年龄超过15进入到老年代,该参数在串行GC时有效------
-XX:PretenureSizeThreshold=3145728:单位字节,只对Serial和ParNew两款收集器有效,新生代采用Parallel Scavenge GC时无效,大于这个值的对象直接在老年代进行分配
非稳定参数,使用方式主要有以下三种:
1,-XX +<option>:开启option参数
2,-XX -<option>:关闭option参数
3,-XX <option>=<value>:将option参数的值设置为value
client模式,Jvm默认垃圾收集器
UseSerialGC:新生代采用Serial收集器,老年代采用Serial Old收集器
server模式,Jvm默认垃圾回收期
UseParallelGc:新生代采用Parallel Scavenge收集器,吞吐量优先的收集器,老年代采用Serial Old收集器
-XX:+UseConcMarkSweepGC:默认关闭,ParNew+CMS+Serial Old,当CMS收集器出现ConcurrentModeFailure错误(Jvm预留空间不足以容纳程序使用),采用后备收集器Serial Old
CMS相关参数
-XX:CMSInitiatingOccupancyFraction=80:CMS收集器在老年代空间被使用多少时触发FullGC,默认为92
-XX:+UseCMSCompactAtFullCollection:CMS收集器在FullGC时开启内存碎片的压缩,默认关闭,需要的时候可以选择打开
-XX:CMSFullGCsBeforeCompaction=8:执行多少次不压缩FullGC后,进行一次压缩,默认是0(代表每次FullGC都进行压缩)
-XX:+UseCMSInitiatingOccupancyOnly:使用手动定义初始化定义开始,禁止hostspot自行触发CMS GC
-XX:ParallelGCThreads=8:并行收集器的线程数,此值最好配置与处理器数目相等 同样适用于CMS
日志参数:
-XX:+HeapDumpOnOutOfMemoryError:当发生内存溢出时,进行堆内存dump
-XX:+PrintGCDetails:打印GC的详细信息
======================================================================
企业实际配置
-server -Xms1028m -Xmx1028m -XX:PermSize=256m -XX:MaxPermSize=256m -Xmn512m -XX:MaxDirectMemorySize=1g -XX:SurvivorRatio=10
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSMaxAbortablePrecleanTime=5000
-XX:+CMSClassUnloadingEnabled
-XX:CMSInitiatingOccupancyFraction=80
-XX:+UseCMSInitiatingOccupancyOnly
-XX:ParallelGCThreads=8
-Xloggc:/home/admin/logs/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/admin/logs/java.hprof
===========================================================
JVM内存泄漏接口:
http://localhost:8080/PerfTeach/MemoryLeak?userId=123&password=abc&waitTime=5
cd /home/server/tomcat1/bin
1. vi catalina.sh
第二行加入:JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m -Xss256k -XX:PermSize=32m -XX:MaxPermSize=32m -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=fale -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.200"
2.启动tomcat
./startup.sh & tail -f ../logs/catalina.out
3.浏览器调用这个接口
http://192.168.1.200:8080/PerfTeach/MemoryLeak?userId=123&password=abc&waitTime=5
查看tomcat的端口 ps -ef|grep tomcat
跳转到javahome目录下 echo $JAVA_HOME
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.221-2.6.18.0.el7_6.x86_64/jre/bin
如果报jstat comant not found需要安装 openjdk-devel-debug
安装jmap : yum -y whatprovides '*/jmap'
yum install -y java-1.8.0-openjdk-devel-debug
jstat -gcutil 1535 1000 1000 (间隔1秒, 抓1000次)
看堆的配置: jmap -heap 1462 查看jvm中的配置信息
也可启动 Jvisualvm进行远程监控
cmd下 输入jvisualvm
内存泄漏:若堆内存的波谷一直在上升,最终会到最大值;
出现内存泄漏的时候即使停止压测,也不能恢复。只能重启tomcat?
进入tomcat查看日志
可在linux中输入: jmap –histo pid | head -20 (pid为tomcat进程号, 查看老年代中哪个对象占比最多,研发排查)
刚刚出现内存泄漏的时候 赶紧抓堆; 太晚了可能抓不到了
把类占用的空间和数量,发给研发排查。
jvisualvm也可以进行抓堆
会存在服务器上
结果与Jmap类似。
用jd-gui反编译工具查看代码:可以看jar包和class文件