Java内存泄露模拟及分析解决方法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]参考符圣劝老师建议

相关文档
最新文档