Java内存泄露模拟及分析解决方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
derwee
Java内存泄露模拟及分析解决方法
1.1 实践目标:
1、使用JA V A代码实现模拟内存溢出
2、分析JDK内存溢出的原因
3、总结存在bug的JA V A编码实践
4、总结JVM优化的方法
1.2 模拟内存溢出:
为了方便模拟内存,特意把JVM的内存参数指定为更小(我的本本内存是8G的)。修改eclipse参数文件调用JVM参数:
-vmargs
-Xms40m(原始是-Xms40m)
-Xmx100m(原始是-Xmx384m)
演示JA V A小程序实现原理:使用集合类对象装载大量的Persion对象,每次把new出来的对象加入集合类对象后,更改对象的属性,再从集合类对象中删除该对象。会出现该删除的对象没有被删掉,Persion类对象不断占用内存,导致分配给JVM的内存被耗光。
package .*;
/**
*
* @ClassName: OutOfMemory
* @Description: 内存溢出模拟,提出解决方法
* @author yangdw
* @date 2012-3-25 下午6:58:49
*/
public class OutOfMemory {
public static void main(String[] args)
{
Collection collection = new HashSet();
for(int i=0;i<0;i++)
{
Persion per = new Persion(i,"yangdw");
(per);
1.2.1equals和hashcode重写原则[2]
1.2.1.1 对equals()应该遵循如下要求
1)对称性:如果(y)返回是“true”,那么(x)也应该返回是“true”。
2)自反性:(x)必须返回是“true”。
3)传递性:如果(y)返回是“true”,而且(z)返回是“true”,那么(x)也应该
返回是“true”。
4)任何情况下,(null),永远返回是“false”。
5)(和x不同类型的对象)永远返回是“false”。
1.2.1.2 hashCode()的返回值和equals()的关系如下
1)如果(y)返回“true”,那么x和y的hashCode()必须相等。
2)如果(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不
等。
1.3 基于JVM优化
开始使用JDK默认参数,使用JDK自带的jconsole连续观察内存使用情况,线程数,确定基线后,设置合理的优化参数。根据实际情况定制合适的优化参数,但不要盲目设置JVM的优化参数,可能会触发JDK未知BUG!
-Xms:启动应用时,JVM 堆空间的初始大小值。
-Xmx:应用运行中,JVM 堆空间的极限值。为了不消耗扩大JVM 堆控件分配的开销,往往此参数和-Xms 这个两个值设为相等。
NewSize:堆中新对象区大小。
PermSize设置非堆内存初始值,默认是物理内存的1/64。
MaxPermSize:应用运行中,永久存储区的极限值。
如:set JA V A_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
优化原则:
1、在JVM中如果98%的时间用于GC且可用的Heap size 不足2%的时候将抛出此异常信
息。
2、Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相
同,而-Xmn为1/4的-Xmx值。
3、JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx
指定,默认是物理内存的1/4。
4、默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于
70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
5、内存分配大小2GB-3GB(一般来说Windows系统下为,Linux系统下为2G-3G),而64bit
以上的处理器就不会有限制了。
1.3.1JVM监控工具介绍
JCONSOLE
这是随着JDK分发的一个图形化JVM监控工具,可以观察到java进程的gc,class,内存等信息。
在主界面中有6大tab页:
1.概述:有关堆内存使用情况,线程,类加载和CPU使用情况的总体情况,支
持时间范围查询
2.内存:内存的详细情况,堆和其他内存,支持时间粒度查询
3.线程:峰值/活动线程、各个线程的明细信息、检测死锁
4.类:监控加载和卸载的类
5.vm摘要:有关vm的明细信息
6.MBean:当前Java程序的MBean的操作
支持本地JVM和远程JVM监控。
JProfiler
JProfiler是一个全功能的Java剖析工具,主要用于检查和跟踪系统(限于Java开发的)的性能。
JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。它把CPU、线程和内存的剖析组合在一个强大的应用中。
一般场合,如果只是监控Java应用程序的总体性能情况,和判断JVM相关参数是否设置合理,使用Jconsole即可。但如果要监控对象级这种粒度的问题,需要使用JProfiler 才能完成该任务了。
备注:
[1]参考符圣劝老师建议
[2]参考符圣劝老师建议