资源描述:
《内存溢出问题初步分析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、内存溢出问题初步分析一、内存分类Java虚拟机具有一个堆,堆是运行吋数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。在JVM屮堆之外的内存称为非堆内存(Non-heapmemory)"。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Jaw代码可及的内存,是留给开发人员使用的;菲堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存屮。二、监控内存工具与配置
2、常用查看内存工具1、jconsole介绍:一个基于JMX的GUI工具,用于连接正在运行的JVM0优点是JDKH带,不需要下载,用起来比较方便,所需系统资源小;缺点是分析的不够全面。如果Tomcatstart.bat启动配置:1)/tomcat_home/bin/catalina.bat文件屮找到setJAVA_OPTS=%JAVA_OPTS%,示面追加如下参数・Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=8089-Dcom.sun.mana
3、gement.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false2)启动TomcatI程3)Jrl4tj/java_home/bin/jconsole.exe开发屮Debug启动配置:在Eclipse/window/properties/Tomcat/JVMSettings/11[的AppendtoJVMParameters项,点击add按钮添加如下参数:-Dcom.sun.management.jmxremote-Dcom.sun.man
4、agement.jnixremote.port="9004n-Dcom.sun.management.jmxremote.authenticate=,,falseM-Dcom.sun.management.jmxreniote.ssl="false"*丄xisu丄/UpUdlEAddRemoveDownAppendtoJVMParameters^ms256ff^J{mx512rr^J{XJPermS^e=2^F^^X]CMaxPerrnS^e^±JavaJavaEEJDTWeavingJProfiler+Maven王Plug
5、-inDevelopmentSRemoteSystems+Run/Debug+Server-+Tasks+TeamTerminal日TomcatAdvancedJVMSettingsSourcePathTomcatManagerAppi—iirniini之后启动DEBUG后直接运彳亍/java_home/bin/jconsole.exe即可。2、JprofilerJProfiler是一个全功能的Java剖析王具(profiler),专用于分析J2SE和J2EE应用程序。优点:分析全瓯,各个类型占用内存,类、包等占用内存、CP
6、U使用率等都做了全面的分析。可以作为Eclipse插件,安装简单。缺点:付费、占用资源大。三、浙江EPM现状开发吋和实际部署时,应用的都是Tomcat默认内存管理配置。1、部署初始吋内存分配状况最左面条形图到右边依次为:堆内存:EdenSpace/SurvivorSpace/TenuredGen非堆内存:PermGen[share-rw]]/CodeCache/PermGen[shared-rw
7、/PermGen这里主要看:PermGen全程PermanentGenerationspace,是指内存的永久保存区域,:这一部分
8、用于存放Class和Meta的信息,Class在被Load的时候被放入PermGenspace区域,GC不会在主程序运行期对PermGenspace进行清理,启动状态是的具体参数:已使用:49,484Kb分配:49,664Kb最大值:65,536Kb可见刚刚开启程序PermGenspace就已经被吃掉了大半。正常使用发起流程的吋已使用:60,697Kb分配:60,928Kb最大值:65,536Kb这样一来剩余内存很小。如果发起多个流程,装更多的类后,一定会导致内存溢出。(测试了大概有10次流程,每一次会增加0.01-0.02
9、kb内存,有的时候不会增加)2、开发内存分配状况Debug模式启动会iY川更多的内存。启动T稈内存使用情况:非堆内存由左至右:CodeCache/PermGenPermGen使用情况为:已使用:53,579Kb分配:53,760Kb最大值:65,536Kb与Tomcatstart.bat启