欢迎来到天天文库
浏览记录
ID:5399118
大小:852.50 KB
页数:47页
时间:2017-12-09
《java理解和探查内存不足内存泄漏》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、理解和探查内存不足/内存泄漏OutOfMemoryError/MemoryLeakAnalyze&UtilitiesDemonstrateII(AIX)理解和探查内存不足/内存泄漏听完这次Webinar,您将能够:了解Java基本内存管理基本概念了解发生内存不足/内存泄漏错误的原因和症状了解如何解决内存不足/内存泄漏错误MENUJava内存管理的基本概念内存不足和内存泄漏错误的原因和症状使用分析工具解决内存不足和内存泄漏错误预防内存不足和内存泄漏OutOfMemory分析实例3Java内存管理的基本概念Java内存Java堆内存(heap
2、)Java堆内存(heap):是JVM用于分配Java对象的内存,包含活动对象和不可用对象堆大小通常是在服务器启动时使用java命令中的–Xms(最小)–Xmx(最大)标志来定义。4Java内存管理的基本概念本地内存(nativememory):是JVM用于其内部操作的本地内存(非Java内存)JNI代码和第三方本地模块(例如,本地JDBC驱动程序)也使用本地内存最大本地内存大小取决于以下因素:操作系统进程内存大小限制已经指定用于Java堆的内存进程内存大小:32位操作系统,理论最大值2的32次方=4G进程内存=Java内存+本地内存
3、+加载的可执行文件和库+操作系统保留内存5Java内存管理的基本概念垃圾回收(GarbageCollection,GC):JVM自动检测和释放不再使用的内存。Java运行时JVM会执行GC,这样程序员不再需要显式释放对象。通常在空闲内存降低到某一水平或内存分配达到某一数量后自动触发。以下OutOfMemory简称OOM以下MemoryLeak简称MLHeap简称“堆”6Java内存问题的两种表现形式Java内存问题的两种表现形式:内存不足错误内存泄漏错误内存不足错误--明确显示出java.lang.OutOfMemoryError没有
4、空闲内存可供JVM或本地代码用于分配新对象或内存块在Java堆或本地内存中都可能发生内存泄漏错误--没有错误信息,但是内存几乎耗尽已经分配好的内存或对象,当不再需要,没有得到释放内存曲线是一条斜向上的曲线对Java堆或本地内存都可能产生这个问题通常最终的状态就会导致OOM错误通常内存泄漏ML会导致OOM错误,因此两者的探查方法完全相同!7Java内存问题的两个主要发生区段Java内存问题的两个主要发生区段:Java内存--包括heap堆内存和permanent区本地内存--包括JVM进程内存和java使用的第三方本地代码Java内存不足J
5、ava堆内存heap不足,无法再分配新对象或内存块permanent区内存不足,无法再加载类到内存中(Sun&HpJDK)本地内存不足物理内存不够,无法再得到内存第三方本地代码有内存泄漏的Bug,例如oracleocidriver本地代码JVM的JIT或者JVM本身的Bug8MENUJava内存管理的基本概念内存不足和内存泄漏错误的原因和症状使用分析工具解决内存不足和内存泄漏错误预防内存不足和内存泄漏OutOfMemory/MemoryLeak错误实例9内存不足和内存泄漏错误的典型原因(1)物理内存不足物理内存有限,例如只有1G物理内存很
6、大,但是应用很多,占用太多内存Swap区大小不够WeblogicServer压力太大并发用户太多大数据量分配应用,例如统计报表Permanent区太小用户代码内存不释放httpsession放置了大量对象在内存分配大量数据用户自己创建太多线程调用AWT等画图接口用户代码内存泄漏问题jdbc连接没有close分配好的对象没有close和释放10内存不足和内存泄漏错误的典型原因(2)WeblogicServer配置不当给heap分配的内存太少sessiontimeout时间太长EJBpool和Cache的太大第三方Java应用的内存问题第三方
7、Java应用也存在内存不足或者泄漏问题第三方本地代码的内存泄漏问题第二类JDBC驱动的内存泄漏,例如OracleOciDriver其他第三方本地代码的内存泄漏JVM本身的内存问题JIT技术需要消耗更多的本地内存JVM本身的Bug,例如GC的Bug11在Java堆中发生的OOM的故障症状如果Java堆发生OOM/ML:WeblogicServer运行缓慢,响应速度很慢(JVM在频繁的做GC,Java进程占用比较多的CPU)从console的内存监控曲线看,一直徘徊在顶部最终JVM抛出java.lang.OutOfMemoryError异常,
8、stdout或stderr中将显示这则消息通过threaddump可以看到大部分时间所有线程都在wait,只有GC线程在工作很多线程都在申请内存线程可能会异常退出(即在ThreadDump中看
此文档下载收益归作者所有