java 获取permgen_java permgen内存泄漏问题处理
来自:http://longtask.com/review/2014/06/07/java-permgen-outofmemory/
工作以来,第三次出现内存溢出,第一次是ThreadLocal没有remove造成的问题;第二次是ExecutorService没有正确的shutdown造成的问题;这一次的问题在我出手排查之前,已经知道了是permgen在不断的增长,在permgen中主要有Class和Meta信息,常量。
在开始阶段:排除了ThreadLocal可能导致的问题;排除了Thread可能导致的问题;后面就需要从新的突破点找问题了。
1:基本设置的排查
查找日志中访问量较大的请求的URL:
awk '{print $6}' service-digest.* |awk -F"," '{print $1 ",""1"}'|awk -F"," '{a[$1]+=$2;b[$1]++}END{for(n in a)print a[n] " " n }'|sort -n
查找日志中的调用很多的内容;依然没有发现问题;采用webbench一个个的调用请求来模拟操作,前十名的URL没有发现问题,后面的就没有查看了。
通过线下操作,发现也不是开始怀疑的RMI远程调用的问题;
针对CMS-GC,网上建议开通 -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled ,好吧,我们一开始就是开通的。参考:permgen-out-of-memory-reasons
2:内存使用情况
2.1:查看内存使用情况
jmap -heap pid
2.2:查看permsize的命令
jmap -heap `ps -ef | grep java | grep -v grep` | awk 'NR==44,NR==48'
2.3:触发full gc :
jmap -histo:live pid
2.4:不断的触发full GC 每10分钟观察一下内存的变化情况
PID=`ps -ef | grep java | grep uic | awk '{print $2}'`
for((i=1;i<10000;i++));do
jmap -histo:live ${PID} > /tmp/fullgc.log
jmap -heap ${PID} | awk "NR==42,NR==48" >> heap.log
echo $i
sleep 600
done
2.5:观察一段时间后(5个小时),分析相关的permsize的内存增长情况
awk '{if(NR%7==0) print $0}' heap.log
3:查看perm中的情况
jmap -permstat pid
查询的结果类似一下情况:
0x00000000ce58bb18 1 3200 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700
0x00000000cec33d48 1 3088 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700
0x00000000ce39c8b0 1 1944 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700
0x00000000ce8ab270 1 3104 null dead sun/reflect/DelegatingClassLoader@0x00000000f4067700
0x00000000ceb1d108 1 3104 0x00000000cc02c030 dead sun/reflect/DelegatingClassLoader@0x00000000f4067700
total = 1600 11325 60491768 N/A alive=1, dead=1599 N/A
不是反射的问题。(dead sun/reflect/DelegatingClassLoader)
4:查看JDK的相关垃圾回收情况
我们使用了CMS GC,过程中发现的GC日志看不出任何问题。
PS:未来我们找个时间专门讨论一下CMS GC的过程,方便我们在未来的垃圾处理过程中找到更加合理的方法去处理问题。
5:查看perm中的类加载情况
在启动的脚本中打开-verbose:class来查看运行的过程中到底多少个类被加载了。【verbose和verbose:class意义相同, 还有-verbose:gc, -verbose:jni】
JAVA_OPTS="${JAVA_OPTS} -verbose:class"
启动脚本中把输出内容从/dev/null 2>&1 & 修改为 >${PWD}/jvm.log
我们通过jvm的日志发现如下奇怪的日志:
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_249 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_250 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_251 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_252 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_253 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_254 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
[Loaded com.hqb360.uic.dao.point.entity.BonusPointDetail$$BulkBeanByCGLIB$$5a972456_255 from file:/opt/jetty/work/jetty-0.0.0.0-8080-uic.war-_uic-any-/webapp/WEB-INF/lib/cglib-2.2.2.jar]
uic.dao.point.entity.BonusPointDetail的类一直在perm中增加,每次都在复制,没有重用,也没有被垃圾回收。问题基本就定位到这个地方。
6:找出问题的具体原因
6.1:去掉类中的反射,发现问题没有解决。空欢喜了一场!!!!
6.2:反复的测试调用的页面,发现在插入操作的过程中,会出现步骤5中perm class日志的情况。针对
INSERT INTO bonus_point_detail (
id,
……
gmt_created,
gmt_modified
)
VALUES (
#id#,
……
now(),
now()
)
这样的情况,我们修改为:
INSERT INTO bonus_point_detail (
id,
……
gmt_created,
gmt_modified
)
VALUES (
#id#,
……
now(),
now()
)
后续测试一下,发现问题解决,permgen不再持续增长;当某个内容写操作比较多的时候,直接导致permgen里面有大量的类消息,从而导致了内存溢出。
待处理:我们将下次讨论为什么不能在insert的时候使用isNotEmpty的问题。
java 获取permgen_java permgen内存泄漏问题处理相关推荐
- java 获取permgen_java – 如何查看PermGen中存储的确切内容?
在我的应用程序中,我有一个PermGen内存不足错误,我想知道导致它的原因. 我通过VisualVM连接到我的应用程序. 我想知道在我的应用程序中究竟消耗了如此多的PermGen内存,但我无法在Vis ...
- 在java中会存在内存泄漏吗?
● 请问,在java中会存在内存泄漏吗?请简单描述一下. 考察点:内存 参考回答: Java中的确存在Java的内存泄漏, 并且事态可以变得相当严重 Java garbage collector自动释 ...
- java 收集系统资源_方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息
CPU使用率: InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTok ...
- Java中如何防止内存泄漏的发生
在Java开发中我们常常会遇到内存泄漏的情况发生.那么为什么会发生内存泄漏,以及怎样去防止! 内存泄漏的定义:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 为什么会发生 ...
- Java中会存在内存泄漏吗,请简单描述。
内存泄漏是指不再被使用的对象或者变量一直被占据在内存中. 理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除. 但是,即使这样,Java也还是 ...
- java 获取permgen_java - Java:如何检查当前的Perm / PermGen大小? - 堆栈内存溢出
您可以在这里使用jmap ,它是JVM堆转储工具. 例如: jmap -heap 5900 它将打印: Heap Configuration: MinHeapFreeRatio = 40 MaxHea ...
- java permgen内存泄漏问题处理
来自:http://longtask.com/review/2014/06/07/java-permgen-outofmemory/ 工作以来,第三次出现内存溢出,第一次是ThreadLocal没有r ...
- java 获取permgen_Java程序故意填写PermGen?
当PermGen已满时,Glassfish有时无法停止,在这种情况下,asadmin stop-domain domain1不起作用.在Glassfish 2.1.1中它会永远坐在那里;在3.x中,它 ...
- java获取cpu使用率/内存使用率/硬盘的使用率
import java.io.File; import java.io.InputStreamReader; import java.io.LineNumberReader; import java. ...
最新文章
- [转载]Linux从程序到进程
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
- 使用python收取IMAP邮件即fox邮件且设置为已读
- SQL 交集 差集 并集 笛卡尔积 应用实例
- Windows 7的使用技巧或功能经典20条
- SAP CRM WebClient UI上将text area里的文本清空的后台处理
- php重载,PHP 重载
- ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解
- 全局路径规划:图搜索算法介绍1(BFS/DFS)
- 使用Asp.Net MVC开发兼职文章系统
- Button控件的点击事件
- 在以太坊模拟链及私链上编译、部署智能合约
- Ajax02 什么是json、json语法、json的使用、利用jQuery实现ajax
- 安装Linux无盘工作站
- 行业专家揭秘家装五大主材底价
- 每天一个PS技巧(原理+实践)——简单背景的抠图与毛发抠图
- GEO数据挖掘(学习笔记)
- 十六进制表示法(二进制/十六进制/十进制之间的转换)
- ROS笔记(一)xxx.launch文件详解
- 解决制作FAT32格式的重装U盘中文件过大问题
热门文章
- 同一浏览器下多用户登录问题解决
- gulp修改服务器端口,在gulp-nodemon中设置端口有什么用处?
- matlab 图中的legend,matlab中legend加图示命令的使用
- 室内定位关键技术(indoor location)
- jaccard相似度 java_jaccard相似度算法
- 阿里云单位网站备案承诺书填写(单位/个人)
- SpringCloud-7-解决上传图片限制为1M的问题
- antd4.x版本解决父组件传递给子组件值的时候动态显示initialValue值的问题
- 预约系统c++ qt mysql
- php修改音频文件_php如何实现音频格式转换