《java理解和探查内存不足内存泄漏.ppt》由会员分享,可在线阅读,更多相关《java理解和探查内存不足内存泄漏.ppt(47页珍藏版)》请在三一办公上搜索。
1、理解和探查内存不足/内存泄漏OutOfMemoryError/Memory Leak Analyze&Utilities Demonstrate II(AIX),理解和探查内存不足/内存泄漏,听完这次Webinar,您将能够:了解Java基本内存管理基本概念了解发生内存不足/内存泄漏错误的原因和症状了解如何解决内存不足/内存泄漏错误,3,MENU,Java内存管理的基本概念内存不足和内存泄漏错误的原因和症状使用分析工具解决内存不足和内存泄漏错误预防内存不足和内存泄漏OutOfMemory分析实例,4,Java内存管理的基本概念,Java内存Java 堆内存(heap)Java 堆内存(heap
2、):是 JVM 用于分配 Java 对象的内存,包含活动对象和不可用对象 堆大小通常是在服务器启动时使用 java 命令中的 Xms(最小)Xmx(最大)标志来定义。,5,Java内存管理的基本概念,本地内存(native memory):是 JVM 用于其内部操作的本地内存(非Java内存)JNI 代码和第三方本地模块(例如,本地 JDBC 驱动程序)也使用本地内存 最大本地内存大小取决于以下因素:操作系统进程内存大小限制 已经指定用于 Java 堆的内存进程内存大小:32位操作系统,理论最大值2的32次方4G进程内存 Java 内存 本地内存 加载的可执行文件和库 操作系统保留内存,6,J
3、ava内存管理的基本概念,垃圾回收(Garbage Collection,GC):JVM自动检测和释放不再使用的内存。Java 运行时JVM会执行 GC,这样程序员不再需要显式释放对象。通常在空闲内存降低到某一水平或内存分配达到某一数量后自动触发。以下OutOfMemory 简称 OOM以下Memory Leak 简称 MLHeap简称“堆”,7,Java内存问题的两种表现形式,Java内存问题的两种表现形式:内存不足错误内存泄漏错误内存不足错误明确显示出java.lang.OutOfMemoryError没有空闲内存可供 JVM 或本地代码用于分配新对象或内存块 在 Java 堆或本地内存中
4、都可能发生内存泄漏错误没有错误信息,但是内存几乎耗尽 已经分配好的内存或对象,当不再需要,没有得到释放 内存曲线是一条斜向上的曲线对 Java 堆或本地内存都可能产生这个问题 通常最终的状态就会导致 OOM 错误通常内存泄漏ML会导致 OOM错误,因此两者的探查方法完全相同!,8,Java内存问题的两个主要发生区段,Java内存问题的两个主要发生区段:Java内存包括heap堆内存和permanent区本地内存包括JVM进程内存和java使用的第三方本地代码Java内存不足Java堆内存heap不足,无法再分配新对象或内存块 permanent区内存不足,无法再加载类到内存中(Sun&Hp J
5、DK)本地内存不足物理内存不够,无法再得到内存 第三方本地代码有内存泄漏的Bug,例如oracle oci driver本地代码 JVM的JIT或者JVM本身的Bug,9,MENU,Java内存管理的基本概念内存不足和内存泄漏错误的原因和症状使用分析工具解决内存不足和内存泄漏错误预防内存不足和内存泄漏OutOfMemory/Memory Leak错误实例,10,内存不足和内存泄漏错误的典型原因(1),物理内存不足物理内存有限,例如只有1G物理内存很大,但是应用很多,占用太多内存Swap区大小不够Weblogic Server压力太大并发用户太多大数据量分配应用,例如统计报表Permanent区
6、太小用户代码内存不释放http session放置了大量对象在内存分配大量数据用户自己创建太多线程调用AWT等画图接口用户代码内存泄漏问题jdbc连接没有close分配好的对象没有close和释放,11,内存不足和内存泄漏错误的典型原因(2),Weblogic Server配置不当给heap分配的内存太少session timeout时间太长EJB pool和Cache的太大第三方Java应用的内存问题第三方Java应用也存在内存不足或者泄漏问题第三方本地代码的内存泄漏问题第二类JDBC驱动的内存泄漏,例如Oracle Oci Driver其他第三方本地代码的内存泄漏JVM本身的内存问题JIT
7、技术需要消耗更多的本地内存JVM本身的Bug,例如GC的Bug,12,在 Java 堆中发生的 OOM 的故障症状,如果 Java 堆发生 OOM/ML:Weblogic Server运行缓慢,响应速度很慢(JVM在频繁的做GC,Java进程占用比较多的CPU)从console的内存监控曲线看,一直徘徊在顶部最终JVM抛出 java.lang.OutOfMemoryError 异常,stdout 或 stderr 中将显示这则消息 通过thread dump可以看到大部分时间所有线程都在wait,只有GC线程在工作很多线程都在申请内存线程可能会异常退出(即在 Thread Dump 中看不到这
8、个线程,线程丢失)持续的Java 堆OOM/ML错误偶尔也会导致JVM进程退出服务,通常伴随会产生一个文本Core文件,13,JVM退出时产生的文本Core文件,通常JVM异常退出伴随会产生一个文本Core文件除了OOM,JVM也会因为其他原因异常退出IBM JDK-javacore*.txt文件,14,小节回顾,内存不足和内存泄漏错误的典型原因OOM 错误相关故障症状,在本小节中,我们讲述了以下内容:,15,MENU,Java内存管理的基本概念内存不足和内存泄漏错误的原因和症状使用分析工具解决内存不足和内存泄漏错误预防内存不足和内存泄漏OutOfMemory错误实例,16,使用分析工具来分析
9、OOM问题,发生Java Heap OOM 问题时,无法定位到问题,最终的办法只能使用分析工具来做分析。常用内存分析工具HeapAnalyzer or HeapRoots for IBM JDK离线分析,17,HeapAnalyzer/HeapRoots(1),HeapAnalyzer/HeapRoots是一款针对IBM JDK的内存文本镜像HeapDump的分析工具特性:离线分析,不影响生产系统需要得到IBM JDK内存镜像只支持IBM JDKHeapRoots字符界面,HeapAnalyzer是HeapRoots的图形界面启动方式:Kill-3 得到heapdump文件启动HeapAnal
10、yzer或者HeapRoots,加载heapdump文件图形化分析,18,HeapAnalyzer/HeapRoots(2),HeapDump是IBM JDK Heap内存的一个文本镜像,默认生成位置在Weblogic Server启动目录下,通常是Domain目录 如果得不到HeapDump,可能是禁止生成HeapDump的生成开关export IBM_HEAPDUMP=trueexport IBM_HEAP_DUMP=trueexport IBM_HEAPDUMP_OUTOFMEMORY=trueexport IBM_JAVADUMP_OUTOFMEMORY=trueexport IBM_
11、JAVACORE_OUTOFMEMORY=trueexport IBM_HEAPDUMPDIR=注意:通常HeapDump会比较大,尤其是在Heap内存设置很大的情况下为了重现问题,得到现场数据,建议先把HeapDump调小,推荐1G以下在Window上,如果HeapDump大于1G,可能会无法打开,出现OOM错误启动HeapAnalyzer需要指定-Xmx参数,19,HeapAnalyzer/HeapRoots(3),启动界面,20,HeapAnalyzer/HeapRoots(4),内存按树状引用关系显示,21,HeapAnalyzer/HeapRoots(5),内存按对象和类型显示,22
12、,HeapAnalyzer/HeapRoots(6),找到怀疑泄漏的内存对象,23,小节回顾,内存分析工具HeapAnalyzer/HeapRoots,在本小节中,我们学习了以下内容:,24,MENU,Java内存管理的基本概念内存不足和内存泄漏错误的原因和症状诊断、定位和解决内存不足和内存泄漏错误 预防内存不足和内存泄漏OutOfMemory错误实例,25,预防内存不足和内存泄漏,最好的补救不如事先的预防预防内存不足和内存泄漏系统管理代码编写,26,预防内存不足和内存泄漏系统管理,系统管理足够的物理内存,设置适当的Swap区大小最佳的HEAP内存设置使用最新的操作系统/最新的JDK/最新版本
13、的WLS使用Weblogic Server认证的JDK尽量少使用第三方本地代码,或使用Java替代方案根据应用设置适当的HttpSession Timeout时间根据应用设置适当的EJB Pool/Cache,27,预防内存不足和内存泄漏代码编写,代码编写不要放置大量对象到Session中不要缓存太多数据用完的资源一定要close(),例如IO,File,JDBC连接合理的从数据库取得适量数据XML解析对大内存的需求统计和报表业务的负荷问题,28,小节回顾,预防内存不足和内存泄漏系统管理代码编写,在本小节中,我们讲述了以下内容:,29,MENU,Java内存管理的基本概念内存不足和内存泄漏错误
14、的原因和症状诊断、定位和解决内存不足和内存泄漏错误 预防内存不足和内存泄漏OutOfMemory错误实例,30,OutOfMemory错误实例,案 例 一,31,OutOfMemory错误实例(1)现象,环境IBM AIX 5.2,JDK1.4.2,Weblogic Server 813刚启动很好,过了一段时间,用户数上来,就发生OOM。自动产生heapdump和javacore文件只能重启。重启过了一段时间又是这样。,32,OutOfMemory错误实例(1)收集信息,GC日志JavaCore文件分析Thread DumpHeapDump用HeapAnalyser,33,OutOfMemor
15、y错误实例(1)GC日志,*,34,OutOfMemory错误实例(1)Thread Dump,1TISIGINFO OUTOFMEMORY received 1TIDATETIME Date:2005/05/11 at 15:56:131TIFILENAME Javacore filename:/bea/user_projects/domains/mydomain/javacore696496.1115798173.txt1XHTIME Wed May 11 15:56:13 20051XHSIGRECV Unexpected signal-1 received at 0 x0 in.Pro
16、cessing terminated.1XHFULLVERSION J2RE 1.4.2 IBM AIX build ca1420-200406262CIUSERARG-Xms1024m2CIUSERARG-Xmx1024m2CIUSERARG-verbose:gc2CIUSERARG-Xverbosegclog:/bea/gc.log1STHEAPFREE Bytes of Heap Space Free:45b8(17,848)1STHEAPALLOC Bytes of Heap Space Allocated:3ffefa00(1,073,674,752)2LKREGMON Heap l
17、ock(0 x30071788):owner ExecuteThread:0 for queue:weblogic.socket.Muxer(0 x7BA1EC20),entry count 23LKWAITERQ Waiting to enter:3LKWAITER ExecuteThread:2 for queue:weblogic.kernel.Non-Blocking(0 x7DF83CA0)3LKWAITER ListenThread.Default(0 x7D9D78A0)3LKWAITER weblogic.health.CoreHealthMonitor(0 x7C6E3320
18、)3LKWAITER Thread-5(0 x7C25BC20)3LKWAITER ExecuteThread:2 for queue:weblogic.admin.RMI(0 x7BD332A0)3LKWAITER ExecuteThread:0 for queue:weblogic.admin.RMI(0 x7BD298A0)3LKWAITER ExecuteThread:2 for queue:weblogic.socket.Muxer(0 x7BA1FEA0)3LKWAITER ExecuteThread:1 for queue:weblogic.socket.Muxer(0 x7BA
19、1F8A0)3LKWAITER ExecuteThread:149 for queue:weblogic.kernel.Default(0 x7B4AE3A0)3LKWAITER ExecuteThread:143 for queue:weblogic.kernel.Default(0 x7B180920)3LKWAITER ExecuteThread:142 for queue:weblogic.kernel.Default(0 x7B0F8F20)3LKWAITER ExecuteThread:128 for queue:weblogic.kernel.Default(0 x7A98E6A
20、0)3LKWAITER ExecuteThread:127 for queue:weblogic.kernel.Default(0 x7A906D20)3LKWAITER ExecuteThread:122 for queue:weblogic.kernel.Default(0 x7A660C20)3LKWAITER ExecuteThread:107 for queue:weblogic.kernel.Default(0 x79E6EA20)3LKWAITER ExecuteThread:100 for queue:weblogic.kernel.Default(0 x79AB6420)3L
21、KWAITER ExecuteThread:99 for queue:weblogic.kernel.Default(0 x79A2EA20)3LKWAITER ExecuteThread:98 for queue:weblogic.kernel.Default(0 x799A70A0),35,OutOfMemory错误实例(1)Thread Dump,3XMTHREADINFO ExecuteThread:81 for queue:weblogic.kernel.Default(TID:0 x30106330,sys_thread_t:0 x790A5AA0,state:CW,native
22、ID:0 x5B5C)prio=54XESTACKTRACE at java.lang.Object.wait(Native Method)4XESTACKTRACE at java.lang.Object.wait(Object.java:443)4XESTACKTRACE at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:153)4XESTACKTRACE at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:172)3XMTHREADINFO Ex
23、ecuteThread:98 for queue:weblogic.kernel.Default(TID:0 x30105890,sys_thread_t:0 x799A70A0,state:MW,native ID:0 x6C6D)prio=54XESTACKTRACE at java.lang.String.substring(String.java(Compiled Code)4XESTACKTRACE at java.lang.String.substring(String.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.int
24、ernal.WarClassFinder.getSource(WarClassFinder.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.internal.WebAppServletContext.getSource(WebAppServletContext.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.internal.WebAppServletContext.getResourceAsSource(WebAppServletContext.java(Compiled Co
25、de)4XESTACKTRACE at weblogic.servlet.internal.WebAppServletContext.getResourceAsSource(WebAppServletContext.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.internal.WebAppServletContext.isResourceStale(WebAppServletContext.java(Compiled Code)4XESTACKTRACE at jsp_servlet._feebyowner._search_resu
26、lt._isStale(_search_result.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.jsp.JspStub.isServletStale(JspStub.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.internal.ServletStubImpl.isStale(ServletStubImpl.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.jsp.JspStub.checkForReload(Jsp
27、Stub.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java(Compiled Code)4XESTACKTRACE at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java(Compiled Code),36,OutOfMemory错误实例(1)其他信息,内存下降太快,陡降!又陡升!有报表业务针对这个报表业务做压力测试,10个
28、用户同时工作,出现OOM!,37,OutOfMemory错误实例(1)分析,用户没有估计到报表业务的内存需求量用户调整报表业务的实现方式和技术方案,38,OutOfMemory错误实例,案 例 二,39,OutOfMemory错误实例(2)现象,环境IBM AIX 5.2,JDK1.4.2,Weblogic Server 813刚刚启动,运行非常正常过了一段时间(不定),WLS heap垃圾回收出现异常,但是从当时的GC日志看,剩余内存还很多。如果此时不及时的重启weblogic server,heap内存会被迅速的被全部用掉,40,OutOfMemory错误实例(2)答案,GC日志Threa
29、d DumpHeapDump用HeapAnalyser,41,OutOfMemory错误实例(2)GC日志,=32),weak 42,final 1563,phantom 0=32),weak 24,final 1370,phantom 0=32),weak 24,final 1527,phantom 0=32),weak 14,final 1405,phantom 0=32),weak 10,final 99,phantom 0,42,OutOfMemory错误实例(2)Thread Dump,1TISIGINFO signal 3 received 1TIDATETIME Date:200
30、5/05/05 at 17:33:361TIFILENAME Javacore filename:/bea/user_projects/domains/myomain/javacore417864.1115285616.txt2CIUSERARG-verbose:gc2CIUSERARG-Xms256m2CIUSERARG-Xmx1536m2CIUSERARG-DIBM_HEAPDUMP=TRUE2CIUSERARG-DIBM_JAVA_HEAPDUMP_TEXT=true1STHEAPFREE Bytes of Heap Space Free:6a67858(111,573,080)1STH
31、EAPALLOC Bytes of Heap Space Allocated:11bffa00(297,794,048)2LKREGMON Heap lock(0 x30071B28):owner Signal dispatcher(0 x3666C3A0),entry count 13LKWAITERQ Waiting to enter:3LKWAITER ListenThread.Default(0 x3D29A2A0)3LKWAITER ExecuteThread:1 for queue:weblogic.admin.RMI(0 x3B73D1A0)3LKWAITER ExecuteTh
32、read:0 for queue:weblogic.admin.RMI(0 x3B7374A0)3LKWAITER ExecuteThread:2 for queue:weblogic.socket.Muxer(0 x3B436EA0)3LKWAITER ExecuteThread:1 for queue:weblogic.socket.Muxer(0 x3B4338A0)3LKWAITER ExecuteThread:1 for queue:weblogic.kernel.System(0 x3AFF23A0)3LKWAITER ExecuteThread:0 for queue:weblo
33、gic.kernel.System(0 x3AF6AA20)3LKWAITER ExecuteThread:77 for queue:weblogic.kernel.Default(0 x3ADD3C20)3LKWAITER ExecuteThread:65 for queue:weblogic.kernel.Default(0 x3A776820)3LKWAITER ExecuteThread:64 for queue:weblogic.kernel.Default(0 x3A6EEE20),43,OutOfMemory错误实例(2)Thread Dump,3XMTHREADINFO Exe
34、cuteThread:65 for queue:weblogic.kernel.Default(TID:0 x70066F60,sys_thread_t:0 x3A776820,state:MW,native ID:0 x494A)prio=54XESTACKTRACE at java.lang.Object.clone(Native Method)4XESTACKTRACE at java.util.Hashtable.clone(Hashtable.java(Compiled Code)4XESTACKTRACE at weblogic.t3.srvr.Scavenger.trigger(
35、Scavenger.java(Compiled Code)4XESTACKTRACE at mon.internal.ScheduledTrigger.run(ScheduledTrigger.java(Compiled Code)4XESTACKTRACE at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java(Compiled Code)4XESTACKTRACE at weblogic.security.service.SecurityManager.runAs(Secur
36、ityManager.java(Compiled Code)4XESTACKTRACE at mon.internal.ScheduledTrigger.executeLocally(ScheduledTrigger.java(Compiled Code)4XESTACKTRACE at mon.internal.ScheduledTrigger.execute(ScheduledTrigger.java(Compiled Code)4XESTACKTRACE at weblogic.time.server.ScheduledTrigger.execute(ScheduledTrigger.j
37、ava(Compiled Code)4XESTACKTRACE at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java(Compiled Code)4XESTACKTRACE at weblogic.kernel.ExecuteThread.run(ExecuteThread.java(Compiled Code)3XMTHREADINFO ExecuteThread:63 for queue:weblogic.kernel.Default(TID:0 x700670A0,sys_thread_t:0 x3A6674A0,stat
38、e:CW,native ID:0 x4748)prio=54XESTACKTRACE at java.lang.Object.wait(Native Method)4XESTACKTRACE at java.lang.Object.wait(Object.java:443)4XESTACKTRACE at weblogic.kernel.ExecuteThread.waitForRequest(ExecuteThread.java:153)4XESTACKTRACE at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:172)3XMT
39、HREADINFO Finalizer(TID:0 x7006B8B0,sys_thread_t:0 x3677CC20,state:R,native ID:0 x304)prio=84XESTACKTRACE at.SocketInputStream.socketRead0(Native Method)4XESTACKTRACE at.SocketInputStream.read(SocketInputStream.java(Compiled Code)4XESTACKTRACE at java.io.BufferedInputStream.fill(BufferedInputStream.
40、java(Compiled Code)4XESTACKTRACE at java.io.BufferedInputStream.read(BufferedInputStream.java(Compiled Code)4XESTACKTRACE at.TransferProtocolClient.readServerResponse(TransferProtocolClient.java(Compiled Code)4XESTACKTRACE at.ftp.FtpClient.readReply(FtpClient.java(Compiled Code)4XESTACKTRACE at.ftp.
41、FtpClient.issueCommand(FtpClient.java(Compiled Code)4XESTACKTRACE at.ftp.FtpClient.closeServer(FtpClient.java:188)4XESTACKTRACE at.ftp.FtpClient.finalize(FtpClient.java:738)4XESTACKTRACE at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)4XESTACKTRACE at java.lang.ref.Finalizer.runFinaliz
42、er(Finalizer.java(Compiled Code)4XESTACKTRACE at java.lang.ref.Finalizer.access$100(Finalizer.java(Compiled Code)4XESTACKTRACE at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java(Compiled Code),44,OutOfMemory错误实例(2)HeapDump,45,OutOfMemory错误实例(2)分析,GC日志中关键在Sweep时间/StackOverFlowHeapDump分析对象结果显示大量Finalizer对象Thread Dump中关键看Finalizer分析:ftp连接在程序中没有及时和正常关闭,导致IBM JDK垃圾回收无法快速有效的收集和回收这些连接 垃圾回收中,ftp连接的关闭需要很长的时间,导致Sweep中排队太长,堵在Sweep过程。垃圾回收无法有效的开展工作,导致内存问题的出现,46,小节回顾,二个OOM/ML解决实例,在本小节中,我们讲述了以下内容:,47,回顾,内存不足/内存泄漏的基本概念内存泄漏错误的原因和症状应用分析工具解决问题预防内存不足和内存泄漏OOM/ML实例,在本次Webinar中,我们讲述了以下内容:,