JVM内存结构和垃圾回收

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文件 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值