记录2016 JVM 内存分析过程

Java内存溢出分析

  1. java内存分类

java内存分为堆内存和非堆内存。

1) 非堆内存指的是加载class文件所使用的内存,使用permsize相关参数可以配置其大小,一般程序使用几百兆就足够了;

2) 堆内存是垃圾回收器负责回收的内存,分为新生代和老年代,一般内存溢出问题都是老年代内存持续增大,无法回收导致。新生代内存中的对象一般都是朝生夕死的,很快就可以被回收,如果新生代中对象的生命周期过长、或对象过大时,新生代对象会转移到老年代中。

2.内存查看工具

可以使用jdk自带的jconsole工具查看内存使用情况。

进入jdk所在目录,输入命令jconsole,出现如下界面

 

 

3.内存分析工具

如果程序运行不稳定,可以通过生成dump文件分析内存中大量存在的类对象,进而分析程序哪里写的不合理。分析dump文件工具可使用eclipsememory analysis

dump文件生成命令:jmap -dump:format=b,file=文件名 [pid]

 

使用memory analysis打开dump文件如下截图,截图反映SearchGroup对象相关代码书写有问题,占用内存过高:

 

一般导致内存溢出的原因:

1数据库查询语句没有动态传参;

2)导出excel文件未使用流写入方式;

3)使用static变量导致对象无法回收等。

 

页面耗内存,是因为使用了一个tiles框架,<tiles:put name="content" type="String">这种写法会导致页面缓存到jvm堆内存中;<tiles:put name="content" value="/WEB-INF/pages/com//order/layout/left_down_app-put.jsp"/>这种写法不会

cpu100%问题,页面http请求pendding状态:

使用的是hibernate3.1.2的包,此版本存在bug,get有synchronize方法,put等其他没有,多线程访问时发生循环i值被反复更改,无法跳出循环;升级到3.3.0-GA版本解决,但3.3.0版本count、sum sql语句返回的值类型由Integer更改为Long,需修改程序代码

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值