java理解和探查内存不足内存泄漏.ppt

上传人:本田雅阁 文档编号:2145502 上传时间:2019-02-21 格式:PPT 页数:47 大小:852.51KB
返回 下载 相关 举报
java理解和探查内存不足内存泄漏.ppt_第1页
第1页 / 共47页
java理解和探查内存不足内存泄漏.ppt_第2页
第2页 / 共47页
java理解和探查内存不足内存泄漏.ppt_第3页
第3页 / 共47页
亲,该文档总共47页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《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) J

2、ava 堆内存(heap): 是 JVM 用于分配 Java 对象的内存,包含活动对象 和不可用对象 堆大小通常是在服务器启动时使用 java 命令中的 Xms(最小) Xmx(最大)标志来定义。,5,Java内存管理的基本概念,本地内存(native memory): 是 JVM 用于其内部操作的本地内存(非Java内存) JNI 代码和第三方本地模块(例如,本地 JDBC 驱动 程序)也使用本地内存 最大本地内存大小取决于以下因素: 操作系统进程内存大小限制 已经指定用于 Java 堆的内存 进程内存大小: 32位操作系统,理论最大值2的32次方4G 进程内存 Java 内存 本地内存 加

3、载的可执行文件和库 操作系统保留内存,6,Java内存管理的基本概念,垃圾回收 (Garbage Collection, GC): JVM自动检测和释放不再使用的内存。 Java 运行时JVM会执行 GC,这样程序员不再需要显式 释放对象。 通常在空闲内存降低到某一水平或内存分配达到某一 数量后自动触发。 以下OutOfMemory 简称 OOM 以下Memory Leak 简称 ML Heap简称“堆”,7,Java内存问题的两种表现形式,Java内存问题的两种表现形式: 内存不足错误 内存泄漏错误 内存不足错误明确显示出java.lang.OutOfMemoryError 没有空闲内存可供

4、 JVM 或本地代码用于分配新对象或内存块 在 Java 堆或本地内存中都可能发生 内存泄漏错误没有错误信息,但是内存几乎耗尽 已经分配好的内存或对象,当不再需要,没有得到释放 内存曲线是一条斜向上的曲线 对 Java 堆或本地内存都可能产生这个问题 通常最终的状态就会导致 OOM 错误 通常内存泄漏ML会导致 OOM错误,因此两者的探查方法完全相同!,8,Java内存问题的两个主要发生区段,Java内存问题的两个主要发生区段: Java内存包括heap堆内存和permanent区 本地内存包括JVM进程内存和java使用的第三方本地代码 Java内存不足 Java堆内存heap不足,无法再分

5、配新对象或内存块 permanent区内存不足,无法再加载类到内存中(Sun & Hp JDK) 本地内存不足 物理内存不够,无法再得到内存 第三方本地代码有内存泄漏的Bug,例如oracle oci driver本地代码 JVM的JIT或者JVM本身的Bug,9,MENU,Java内存管理的基本概念 内存不足和内存泄漏错误的原因和症状 使用分析工具解决内存不足和内存泄漏错误 预防内存不足和内存泄漏 OutOfMemory/Memory Leak错误实例,10,内存不足和内存泄漏错误的典型原因(1),物理内存不足 物理内存有限,例如只有1G 物理内存很大,但是应用很多,占用太多内存 Swap区

6、大小不够 Weblogic Server压力太大 并发用户太多 大数据量分配应用,例如统计报表 Permanent区太小 用户代码内存不释放 http session放置了大量对象 在内存分配大量数据 用户自己创建太多线程 调用AWT等画图接口 用户代码内存泄漏问题 jdbc连接没有close 分配好的对象没有close和释放,11,内存不足和内存泄漏错误的典型原因(2),Weblogic Server配置不当 给heap分配的内存太少 session timeout时间太长 EJB pool和Cache的太大 第三方Java应用的内存问题 第三方Java应用也存在内存不足或者泄漏问题 第三方

7、本地代码的内存泄漏问题 第二类JDBC驱动的内存泄漏,例如Oracle Oci Driver 其他第三方本地代码的内存泄漏 JVM本身的内存问题 JIT技术需要消耗更多的本地内存 JVM本身的Bug,例如GC的Bug,12,在 Java 堆中发生的 OOM 的故障症状,如果 Java 堆发生 OOM/ML: Weblogic Server运行缓慢,响应速度很慢(JVM在频繁的做GC,Java进程占用比较多的CPU ) 从console的内存监控曲线看,一直徘徊在顶部 最终JVM抛出 java.lang.OutOfMemoryError 异常,stdout 或 stderr 中将显示这则消息 通

8、过thread dump可以看到大部分时间 所有线程都在wait,只有GC线程在工作 很多线程都在申请内存 线程可能会异常退出(即在 Thread Dump 中看不到这个线程,线程丢失) 持续的Java 堆OOM/ML错误偶尔也会导致JVM进程退出服务,通常伴随会产生一个文本Core文件,13,JVM退出时产生的文本Core文件,通常JVM异常退出伴随会产生一个文本Core文件 除了OOM,JVM也会因为其他原因异常退出 IBM JDK - javacore*.txt文件,14,小节回顾,内存不足和内存泄漏错误的典型原因 OOM 错误相关故障症状,在本小节中,我们讲述了以下内容:,15,MEN

9、U,Java内存管理的基本概念 内存不足和内存泄漏错误的原因和症状 使用分析工具解决内存不足和内存泄漏错误 预防内存不足和内存泄漏 OutOfMemory错误实例,16,使用分析工具来分析OOM问题,发生Java Heap OOM 问题时,无法定位到问题,最终的办法只能使用分析工具来做分析。 常用内存分析工具 HeapAnalyzer or HeapRoots for IBM JDK离线分析,17,HeapAnalyzer/HeapRoots(1),HeapAnalyzer/HeapRoots是一款针对IBM JDK的内存文本镜像HeapDump的分析工具 特性: 离线分析,不影响生产系统 需

10、要得到IBM JDK内存镜像 只支持IBM JDK HeapRoots字符界面,HeapAnalyzer是HeapRoots的图形界面 启动方式: Kill -3 得到heapdump文件 启动HeapAnalyzer或者HeapRoots,加载heapdump文件 图形化分析,18,HeapAnalyzer/HeapRoots(2),HeapDump是IBM JDK Heap内存的一个文本镜像,默认生成位置在Weblogic Server启动目录下,通常是Domain目录 如果得不到HeapDump,可能是禁止生成 HeapDump的生成开关 export IBM_HEAPDUMP=true

11、 export IBM_HEAP_DUMP=true export IBM_HEAPDUMP_OUTOFMEMORY=true export IBM_JAVADUMP_OUTOFMEMORY=true export IBM_JAVACORE_OUTOFMEMORY=true export IBM_HEAPDUMPDIR= 注意: 通常HeapDump会比较大,尤其是在Heap内存设置很大的情况下 为了重现问题,得到现场数据,建议先把HeapDump调小,推荐1G以下 在Window上,如果HeapDump大于1G,可能会无法打开,出现OOM错误 启动HeapAnalyzer需要指定-Xmx参数

12、,19,HeapAnalyzer/HeapRoots(3),启动界面,20,HeapAnalyzer/HeapRoots(4),内存按树状引用关系显示,21,HeapAnalyzer/HeapRoots(5),内存按对象和类型显示,22,HeapAnalyzer/HeapRoots(6),找到怀疑泄漏的内存对象,23,小节回顾,内存分析工具 HeapAnalyzer/HeapRoots,在本小节中,我们学习了以下内容:,24,MENU,Java内存管理的基本概念 内存不足和内存泄漏错误的原因和症状 诊断、定位和解决内存不足和内存泄漏错误 预防内存不足和内存泄漏 OutOfMemory错误实例,

13、25,预防内存不足和内存泄漏,最好的补救不如事先的预防 预防内存不足和内存泄漏 系统管理 代码编写,26,预防内存不足和内存泄漏系统管理,系统管理 足够的物理内存,设置适当的Swap区大小 最佳的HEAP内存设置 使用最新的操作系统/最新的JDK/最新版本的WLS 使用Weblogic Server认证的JDK 尽量少使用第三方本地代码,或使用Java替代方案 根据应用设置适当的HttpSession Timeout时间 根据应用设置适当的EJB Pool/Cache,27,预防内存不足和内存泄漏代码编写,代码编写 不要放置大量对象到Session中 不要缓存太多数据 用完的资源一定要clos

14、e(),例如IO,File,JDBC连接 合理的从数据库取得适量数据 XML解析对大内存的需求 统计和报表业务的负荷问题,28,小节回顾,预防内存不足和内存泄漏 系统管理 代码编写,在本小节中,我们讲述了以下内容:,29,MENU,Java内存管理的基本概念 内存不足和内存泄漏错误的原因和症状 诊断、定位和解决内存不足和内存泄漏错误 预防内存不足和内存泄漏 OutOfMemory错误实例,30,OutOfMemory错误实例,案 例 一,31,OutOfMemory错误实例(1)现象,环境IBM AIX 5.2,JDK1.4.2,Weblogic Server 813 刚启动很好,过了一段时间

15、,用户数上来,就发生OOM。自动产生heapdump和javacore文件 只能重启。重启过了一段时间又是这样。,32,OutOfMemory错误实例(1)收集信息,GC日志 JavaCore文件分析 Thread Dump HeapDump用HeapAnalyser,33,OutOfMemory错误实例(1) GC日志, * ,34,OutOfMemory错误实例(1) Thread Dump,1TISIGINFO OUTOFMEMORY received 1TIDATETIME Date: 2005/05/11 at 15:56:13 1TIFILENAME Javacore filena

16、me: /bea/user_projects/domains/mydomain/javacore696496.1115798173.txt 1XHTIME Wed May 11 15:56:13 2005 1XHSIGRECV Unexpected signal -1 received at 0x0 in . Processing terminated. 1XHFULLVERSION J2RE 1.4.2 IBM AIX build ca1420-20040626 2CIUSERARG -Xms1024m 2CIUSERARG -Xmx1024m 2CIUSERARG -verbose:gc

17、2CIUSERARG -Xverbosegclog:/bea/gc.log 1STHEAPFREE Bytes of Heap Space Free: 45b8 (17,848) 1STHEAPALLOC Bytes of Heap Space Allocated: 3ffefa00 (1,073,674,752) 2LKREGMON Heap lock (0x30071788): owner “ExecuteThread: 0 for queue: weblogic.socket.Muxer“ (0x7BA1EC20), entry count 2 3LKWAITERQ Waiting to

18、 enter: 3LKWAITER “ExecuteThread: 2 for queue: weblogic.kernel.Non-Blocking“ (0x7DF83CA0) 3LKWAITER “ListenThread.Default“ (0x7D9D78A0) 3LKWAITER “weblogic.health.CoreHealthMonitor“ (0x7C6E3320) 3LKWAITER “Thread-5“ (0x7C25BC20) 3LKWAITER “ExecuteThread: 2 for queue: weblogic.admin.RMI“ (0x7BD332A0)

19、 3LKWAITER “ExecuteThread: 0 for queue: weblogic.admin.RMI“ (0x7BD298A0) 3LKWAITER “ExecuteThread: 2 for queue: weblogic.socket.Muxer“ (0x7BA1FEA0) 3LKWAITER “ExecuteThread: 1 for queue: weblogic.socket.Muxer“ (0x7BA1F8A0) 3LKWAITER “ExecuteThread: 149 for queue: weblogic.kernel.Default“ (0x7B4AE3A0

20、) 3LKWAITER “ExecuteThread: 143 for queue: weblogic.kernel.Default“ (0x7B180920) 3LKWAITER “ExecuteThread: 142 for queue: weblogic.kernel.Default“ (0x7B0F8F20) 3LKWAITER “ExecuteThread: 128 for queue: weblogic.kernel.Default“ (0x7A98E6A0) 3LKWAITER “ExecuteThread: 127 for queue: weblogic.kernel.Defa

21、ult“ (0x7A906D20) 3LKWAITER “ExecuteThread: 122 for queue: weblogic.kernel.Default“ (0x7A660C20) 3LKWAITER “ExecuteThread: 107 for queue: weblogic.kernel.Default“ (0x79E6EA20) 3LKWAITER “ExecuteThread: 100 for queue: weblogic.kernel.Default“ (0x79AB6420) 3LKWAITER “ExecuteThread: 99 for queue: weblo

22、gic.kernel.Default“ (0x79A2EA20) 3LKWAITER “ExecuteThread: 98 for queue: weblogic.kernel.Default“ (0x799A70A0),35,OutOfMemory错误实例(1) Thread Dump,3XMTHREADINFO “ExecuteThread: 81 for queue: weblogic.kernel.Default“ (TID:0x30106330, sys_thread_t:0x790A5AA0, state:CW, native ID:0x5B5C) prio=5 4XESTACKT

23、RACE 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 “ExecuteThread: 98 for q

24、ueue: weblogic.kernel.Default“ (TID:0x30105890, sys_thread_t:0x799A70A0, state:MW, native ID:0x6C6D) prio=5 4XESTACKTRACE at java.lang.String.substring(String.java(Compiled Code) 4XESTACKTRACE at java.lang.String.substring(String.java(Compiled Code) 4XESTACKTRACE at weblogic.servlet.internal.WarClas

25、sFinder.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 Code) 4XESTAC

26、KTRACE 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_result._isSt

27、ale(_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(JspStub.

28、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个用

29、户同时工作,出现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日志

30、 Thread Dump HeapDump用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 sig

31、nal 3 received 1TIDATETIME Date: 2005/05/05 at 17:33:36 1TIFILENAME Javacore filename: /bea/user_projects/domains/myomain/javacore417864.1115285616.txt 2CIUSERARG -verbose:gc 2CIUSERARG -Xms256m 2CIUSERARG -Xmx1536m 2CIUSERARG -DIBM_HEAPDUMP=TRUE 2CIUSERARG -DIBM_JAVA_HEAPDUMP_TEXT=true 1STHEAPFREE

32、Bytes of Heap Space Free: 6a67858 (111,573,080) 1STHEAPALLOC Bytes of Heap Space Allocated: 11bffa00 (297,794,048) 2LKREGMON Heap lock (0x30071B28): owner “Signal dispatcher“ (0x3666C3A0), entry count 1 3LKWAITERQ Waiting to enter: 3LKWAITER “ListenThread.Default“ (0x3D29A2A0) 3LKWAITER “ExecuteThre

33、ad: 1 for queue: weblogic.admin.RMI“ (0x3B73D1A0) 3LKWAITER “ExecuteThread: 0 for queue: weblogic.admin.RMI“ (0x3B7374A0) 3LKWAITER “ExecuteThread: 2 for queue: weblogic.socket.Muxer“ (0x3B436EA0) 3LKWAITER “ExecuteThread: 1 for queue: weblogic.socket.Muxer“ (0x3B4338A0) 3LKWAITER “ExecuteThread: 1

34、for queue: weblogic.kernel.System“ (0x3AFF23A0) 3LKWAITER “ExecuteThread: 0 for queue: weblogic.kernel.System“ (0x3AF6AA20) 3LKWAITER “ExecuteThread: 77 for queue: weblogic.kernel.Default“ (0x3ADD3C20) 3LKWAITER “ExecuteThread: 65 for queue: weblogic.kernel.Default“ (0x3A776820) 3LKWAITER “ExecuteTh

35、read: 64 for queue: weblogic.kernel.Default“ (0x3A6EEE20),43,OutOfMemory错误实例(2) Thread Dump,3XMTHREADINFO “ExecuteThread: 65 for queue: weblogic.kernel.Default“ (TID:0x70066F60, sys_thread_t:0x3A776820, state:MW, native ID:0x494A) prio=5 4XESTACKTRACE at java.lang.Object.clone(Native Method) 4XESTAC

36、KTRACE at java.util.Hashtable.clone(Hashtable.java(Compiled Code) 4XESTACKTRACE at weblogic.t3.srvr.Scavenger.trigger(Scavenger.java(Compiled Code) 4XESTACKTRACE at mon.internal.ScheduledTrigger.run(ScheduledTrigger.java(Compiled Code) 4XESTACKTRACE at weblogic.security.acl.internal.AuthenticatedSub

37、ject.doAs(AuthenticatedSubject.java(Compiled Code) 4XESTACKTRACE at weblogic.security.service.SecurityManager.runAs(SecurityManager.java(Compiled Code) 4XESTACKTRACE at mon.internal.ScheduledTrigger.executeLocally(ScheduledTrigger.java(Compiled Code) 4XESTACKTRACE at mon.internal.ScheduledTrigger.ex

38、ecute(ScheduledTrigger.java(Compiled Code) 4XESTACKTRACE at weblogic.time.server.ScheduledTrigger.execute(ScheduledTrigger.java(Compiled Code) 4XESTACKTRACE at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java(Compiled Code) 4XESTACKTRACE at weblogic.kernel.ExecuteThread.run(ExecuteThread.jav

39、a(Compiled Code) 3XMTHREADINFO “ExecuteThread: 63 for queue: weblogic.kernel.Default“ (TID:0x700670A0, sys_thread_t:0x3A6674A0, state:CW, native ID:0x4748) prio=5 4XESTACKTRACE at java.lang.Object.wait(Native Method) 4XESTACKTRACE at java.lang.Object.wait(Object.java:443) 4XESTACKTRACE at weblogic.k

40、ernel.ExecuteThread.waitForRequest(ExecuteThread.java:153) 4XESTACKTRACE at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:172) 3XMTHREADINFO “Finalizer“ (TID:0x7006B8B0, sys_thread_t:0x3677CC20, state:R, native ID:0x304) prio=8 4XESTACKTRACE at .SocketInputStream.socketRead0(Native Method) 4X

41、ESTACKTRACE at .SocketInputStream.read(SocketInputStream.java(Compiled Code) 4XESTACKTRACE at java.io.BufferedInputStream.fill(BufferedInputStream.java(Compiled Code) 4XESTACKTRACE at java.io.BufferedInputStream.read(BufferedInputStream.java(Compiled Code) 4XESTACKTRACE at .TransferProtocolClient.re

42、adServerResponse(TransferProtocolClient.java(Compiled Code) 4XESTACKTRACE at .ftp.FtpClient.readReply(FtpClient.java(Compiled Code) 4XESTACKTRACE at .ftp.FtpClient.issueCommand(FtpClient.java(Compiled Code) 4XESTACKTRACE at .ftp.FtpClient.closeServer(FtpClient.java:188) 4XESTACKTRACE at .ftp.FtpClie

43、nt.finalize(FtpClient.java:738) 4XESTACKTRACE at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) 4XESTACKTRACE at java.lang.ref.Finalizer.runFinalizer(Finalizer.java(Compiled Code) 4XESTACKTRACE at java.lang.ref.Finalizer.access$100(Finalizer.java(Compiled Code) 4XESTACKTRACE at java.lan

44、g.ref.Finalizer$FinalizerThread.run(Finalizer.java(Compiled Code),44,OutOfMemory错误实例(2) HeapDump,45,OutOfMemory错误实例(2) 分析,GC日志中关键在Sweep时间/StackOverFlow HeapDump分析对象结果显示大量Finalizer对象 Thread Dump中关键看Finalizer 分析: ftp连接在程序中没有及时和正常关闭,导致IBM JDK垃圾回收无法快速有效的收集和回收这些连接 垃圾回收中,ftp连接的关闭需要很长的时间, 导致Sweep中排队太长,堵在Sweep过程。 垃圾回收无法有效的开展工作,导致内存问题的出现,46,小节回顾,二个OOM/ML解决实例,在本小节中,我们讲述了以下内容:,47,回顾,内存不足/内存泄漏的基本概念 内存泄漏错误的原因和症状 应用分析工具解决问题 预防内存不足和内存泄漏 OOM/ML实例,在本次Webinar中,我们讲述了以下内容:,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1