关于内存溢出和JVisualVM堆分析使用
来源:互联网 发布:韩国idol和演员 知乎 编辑:程序博客网 时间:2024/06/05 08:25
通过VisualVM生成堆Dump,通过”文件“-”装入“,文件类型“选择‘堆Dump.Hprof”选择堆文件路径打开堆转述文件,-一步一步的查看.在Visualvm的首届面,我直接选择了查找 20 保留大小最大的对象。检查最大的对象如图:
正好,它出现了我的AliCloud××类,直接点击打开对象,如图:
这是直接打开的实例控制台,可以看到,我的AliCloud××对象使用了233M的内存,而他的内部属性outputStream占了内存的99%以上,而这个outputtream正就是ObjectOutputStream。而这个类是JDK中自带的类,我在继续对outputream继续分析(右键显示实例就可以把选中的对象当作根对象,继续打开子属性),我尽挑占用内存大的对象一级一级往下找,
这一看我惊呆了,发送了这么多对象,每一个对象都有保存,数据都是全的。至此,我隐约的发现问题的根本。outputStream把数据用Socket发送到另一端,而发送的数据对象默认并没有在完成后清除掉,在ObjectOutputStream内部还持有数据对象的句柄,使GC无法回收占用的内存,从而内存一步步的被耗尽。
后来,我用“ObjectOutputStream 内存泄漏”的关键字Google了一下,找到了内存泄漏的原因[见:http://blog.sina.com.cn/s/blog_7099ca0b0100n9n6.html]。关键在于没有调用reset方法.
在Java其他IO类设计中,OutputSteam是不需要什么reset方法的.这也是Java中ObjectOutputStream和其他IO类使用上不同的地方。
若不是这个OutOffMemery,我想我不会发现这个问题。而且大多数我们序列化对象到文件系统,或者发送少量的数据,都不会有什么大的问题。但是对于ObjectOutputStream发送大量数据时,没有调用reset()方法就会产生这个问题。
- 关于内存溢出和JVisualVM堆分析使用
- 内存溢出 MAT jvisualVM
- jmap, jhat, jvisualvm:java堆内存对象分析利器
- 关于myeclipse报堆内存溢出和永久内存溢出的问题
- 堆,栈,内存泄漏和内存溢出
- jmap、 jhat 分析堆内存溢出
- java 内存泄露 :堆溢出和非堆溢出
- Java中使用jvisualvm进行可视化内存分析
- 关于java中的内存分析-堆和栈【收集资料】
- 一篇不错的关于堆和栈内存的分析
- 性能分析4~jmap命令分析:堆信息、内存溢出
- 内存溢出和内存泄露分析
- Eclipse堆内存溢出
- 堆内存溢出
- java内存堆溢出
- 堆内存溢出原因
- Java堆内存溢出
- JVisualVM使用与分析案例
- 算法笔记3
- mysql主从同步(4)-Slave延迟状态监控
- QT信号和槽用于对象之间的通信
- 论文笔记之目标检测(1)-- DSOD
- 【算法面试题】从1-200中任意选出101个自然数,其中一个数必是另一个数的整数倍
- 关于内存溢出和JVisualVM堆分析使用
- @class和#import的区别
- JAVA设计模式之单例模式
- 双向链表
- [算法分析与设计] leetcode 每周一题: 554. Brick Wall
- Common API Some/IP 环境的搭建
- camel过滤json格式消息
- python接口自动化4-绕过验证码登录(cookie)
- 中心极限定理