JVM 内存溢出

• 堆内存溢出
– 堆内存中存在大量对象,这些对象都有被引用,当所有对象占用空间达到堆内存的最大值,
就会出现内存溢出OutOfMemory:Java heap space

• 永久代溢出
– 类的一些信息,如类名、访问修饰符、字段描述、方法描述等,所占空间大于永久代最大
值,就会出现OutOfMemoryError:PermGen space

两种内存溢出
1、堆内存溢出:本质原因是代码有问题,创建对象不合理,需要优化代码
2、元空间溢出(永久代溢出):本质原因是项目的元空间分配太小了,需要加大元空间的初始值和最大值

 

Jvm常见参数及建议值
• -Xms2048m,初始堆大小,建议<物理内存的1/4,默认值为物理内存的1/64
• -Xmx2048m,最大堆大小,建议与-Xms保持一致,默认值为物理内存的1/4
• -Xmn512m,新生代大小,建议不超过堆内存的1/2
• -Xss1024k,线程堆栈大小,建议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垃圾回收器

内存泄露的现象内存泄露有什么现象?
1,tps出现大幅波动,并慢慢降低,甚至降为0,响应时间随之波动,慢慢升高
2,通过jstat命令看到,Jvm中Old区不断增加,FullGC非常频繁,对应的FullGC消耗的时间也不
断增加
3,通过jconsole/jvisualvm可以看到,堆内存曲线不断上升,接近上限时,变成一条直线
4,日志报错java.lang.OutOfMemoryError: Java heap space

 

内存泄露怎么定位?
1,通过jmap命令:jmap -histo pid | head -20,查看当前堆内存中实例数和占用内存最多的前20
个对象
2,通过jvisualvm,进行远程堆dump,然后把dump文件下载下来,用jvisualvm打开进行分析,可
以看到更直观的jvm中对象的信息

Jmap分析结果
[C :代表的是Char[]
[I :代表的是Int[]
[B :代表的是Byte[]
排查策略:
从上往下
1、找跟业务类有关的对象(一般是以com/cn开头)
2、或者第三方框架相关的对象(一般是以org*)
3、凡是以java*都可以忽略,都属于java底层对象
4、找到某些怀疑的类后,找开发一起看代码,看看代码中哪些地方创建了这个类

在什么样的场景下监控内存泄露问题?
1,在试压阶段,或任意场景都可以考虑通过jvisualvm和jstat监控jvm的情况
2,在稳定性场景中,一定要关注Jvm内存使用的情况,在长时间的压测下,最容易看出内存泄露的
问题

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值