- 浏览: 922775 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (322)
- Hibernate研究&源码 (27)
- Server (10)
- Coder碎语 (64)
- EnglishMulling (11)
- About XML (1)
- persistence (12)
- Core Java & OO (23)
- Java EE (6)
- JavaScript/JSON/Ajax/ext... (22)
- 我的读书笔记 (16)
- Source Codes Study (29)
- workFlow/jBPM (22)
- OFBiz: Open For Business (1)
- 项目积累 (21)
- srcStudy_acegi (1)
- Cache/Ehcache... (9)
- Java Test/JUnit.. (7)
- maven/ant (2)
- 设计模式 (1)
- SOA/cxf/ws-security (2)
- Android (4)
- 云计算/Hadoop (2)
- 加密/签名 (1)
- 正则表达式 (1)
- htmlparser (1)
- 操作系统 (5)
- DB (1)
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示:js跳出循环 ...
jQuery中each的break和continue -
heshifk:
刚刚我也遇到同样的问题,然后就在纠结为什么不能直接使用brea ...
jQuery中each的break和continue -
masuweng:
不错写的.
集万千宠爱于一身的SessionImpl:get研究(四): Hibernate源码研究碎得(8) -
muzi131313:
这个老是忘,做一下笔记还是挺好的
jQuery中each的break和continue -
lg068:
data = data.replace("\n&qu ...
项目小经验: eval与回车符
内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,一般现象是操作一般时间后系统越来越慢,直到死机,但并不能明确是在什么操作上出现的,发生的时间点也没有规律,查看日志或查看数据库也不能定位出问题的代码。
更严重的是内存溢出与数据库锁表在系统开发和单元测试阶段并不容易被发现,当系统正式上线一般时间后,操作的并发量上来了,数据也积累了一些,系统就容易出现内存溢出或是锁表的现象,而此时系统又不能随意停机或重启,为修正BUG带来很大的困难。
本文以笔者开发和支持的多个项目为例,与大家分享在开发过程中遇到的Java内存溢出和数据库锁表的检测和处理解决过程。
2.内存溢出的分析
内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。为了解决Java中内存溢出问题,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要通过调用GC函数来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是中断式执行GC。但GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间。Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。
引起内存溢出的原因有很多种,常见的有以下几种:
- 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
- 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
- 代码中存在死循环或循环产生过多重复的对象实体;
- 使用的第三方软件中的BUG;
- 启动参数内存值设定的过小;
3.内存溢出的解决
内存溢出虽然很棘手,但也有相应的解决办法,可以按照从易到难,一步步的解决。
第一步,就是修改JVM启动参数,直接增加内存。这一点看上去似乎很简单,但很容易被忽略。JVM默认可以使用的内存为64M,Tomcat默认可以使用的内存为128MB,对于稍复杂一点的系统就会不够用。在某项目中,就因为启动参数使用的默认值,经常报“OutOfMemory”错误。因此,-Xms,-Xmx参数一定不要忘记加。
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。在一个项目中,使用两个数据库连接,其中专用于发送短信的数据库连接使用DBCP连接池管理,用户为不将短信发出,有意将数据库连接用户名改错,使得日志中有许多数据库连接异常的日志,一段时间后,就出现 “OutOfMemory”错误。经分析,这是由于DBCP连接池BUG引起的,数据库连接不上后,没有将连接释放,最终使得DBCP报 “OutOfMemory”错误。经过修改正确数据库连接参数后,就没有再出现内存溢出的错误。
查看日志对于分析内存溢出是非常重要的,通过仔细查看日志,分析内存溢出前做过哪些操作,可以大致定位有问题的模块。
第三步,安排有经验的编程人员对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查以下几点:
(1) 检查代码中是否有死循环或递归调用。
(2) 检查是否有大循环重复产生新对象实体。
(3) 检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况。某个项目上线后,每次系统启动两天后,就会出现内存溢出的错误。这种情况一般是代码中出现了缓慢的内存泄漏,用上面三个步骤解决不了,这就需要使用内存查看工具了。
内存查看工具有许多,比较有名的有:Optimizeit Profiler、JProbe Profiler、JinSight和Java1.5的Jconsole等。它们的基本工作原理大同小异,都是监测Java程序运行时所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员可以根据这些信息判断程序是否有内存泄漏问题。一般来说,一个正常的系统在其启动完成后其内存的占用量是基本稳定的,而不应该是无限制的增长的。持续地观察系统运行时使用的内存的大小,可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,如果内存的大小持续地增长,则说明系统存在内存泄漏问题。通过间隔一段时间取一次内存快照,然后对内存快照中对象的使用与引用等信息进行比对与分析,可以找出是哪个类的对象在泄漏。
通过以上四个步骤的分析与处理,基本能处理内存溢出的问题。当然,在这些过程中也需要相当的经验与敏感度,需要在实际的开发与调试过程中不断积累。
总体上来说,产生内存溢出是由于代码写的不好造成的,因此提高代码的质量是最根本的解决办法。有的人认为先把功能实现,有BUG时再在测试阶段进行修正,这种想法是错误的。正如一件产品的质量是在生产制造的过程中决定的,而不是质量检测时决定的,软件的质量在设计与编码阶段就已经决定了,测试只是对软件质量的一个验证,因为测试不可能找出软件中所有的BUG。
=====================================
好久没有转发别人的文章了。 这些天由于一个内存溢出的问题,我又开始看这一块的东西了。 发现一个不错的分析文章, 转到这里, 以备后用。
原文链接: http://blog.csdn.net/bessjiao/article/details/5181816
发表评论
-
Java实现将源文件中的注释替换成空行。
2011-12-27 15:39 2793以Css文件为例, 为了能准确地定位,需要把段注释也要替换 ... -
ant运行java程序时, 它不能加载指定properties文件, 怎么处理?
2011-07-27 17:47 3718运行时, 目录结构如下: . ... -
关于用多线程时任务分配与结果收集的问题的设计讨论
2011-07-27 10:47 2074假定任务是这样的: 对于给定字符串,如“threadTe ... -
File类createNewFile时的一个注意点
2010-11-03 17:42 26566今天体会到一个陷阱,刚开始还觉得是JDK的bug呢 ... -
要static还是不要static?
2010-09-25 14:18 1205内部接口声明加不加static没什么不同 附件Inn ... -
线程join方法的理解
2010-08-22 11:11 2433一个偶然机会,又接 ... -
should effort go into reuse above maintainability and extensibility?
2010-06-04 09:37 1301Master and Student Maste ... -
对接口编程的一些思考
2009-04-10 08:41 1253对一个问题的持续深追,又想起了Java中接口编 ... -
JVM创建一个新对象到底有多大的代价?
2009-04-02 09:54 1620好像是在听一人讲JVM性能调优方面事时, 知道 ... -
序列化(二): 为什么要序列化?
2009-03-20 08:25 1943在readResolve()方法与序列化中, 由r ... -
序列化(一): readResolve()方法与序列化
2009-03-17 10:08 3117在CJC(一) 中提到一个问题,即 readResolve方 ... -
Core Java: 继承覆盖时的一个问题
2009-02-23 21:01 1259看如下Java代码: public class Main { ... -
CoreJava: 父子类都需要实现同一个接口?
2009-02-18 16:16 2448前些写用LinkedHashSet带来的思考(http ... -
Spring中配置Qaurtz时的singlton问题
2008-11-23 17:24 1564上一篇中用TimerTask做了个简单的实验, ... -
试下Spring的scheduledTask: 不应该出问题的问题
2008-11-21 20:39 3095要用Spring的scheduledTask了 ... -
在Java里不用Socket而直接操作远程计算机里的文件.
2008-06-25 18:27 2801今天上班时偶然发现在Java里可以在不用Socket情况下操作 ... -
about @SuppressWarnings.
2008-06-24 13:50 7672about @SuppressWarnings. ... -
<Java.JavaEE面试整理>(10) --"标签"接口,重载vs覆盖........
2008-04-04 15:46 2178Q 13: Java中为什么有些接口里并没有定义任何方法? L ... -
java.sql.Timestamp转为相应字符串的问题及解答
2008-04-01 14:28 2897工作中用到了java.sql.Timestamp这个类,先不说 ... -
"异常"的梦
2008-03-24 08:33 1322"不对呀,电子地图上 ...
相关推荐
本文将详细介绍HeapAnalyzer的使用、功能以及如何通过它来排查和解决Java OOM问题。 一、HeapAnalyzer简介 HeapAnalyzer是一款Java内存分析工具,由IBM开发,它可以帮助开发者检查和分析Java堆内存的状态,找出可能...
### JVM问题排查工具手册 #### 一、概述 在日常的软件开发与维护过程中,针对JVM(Java虚拟机)的性能调优和问题排查是非常关键的一环。本手册旨在提供一套全面且实用的JVM问题排查方法和技术,帮助开发者快速定位...
内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决。 从程序类方面来说,内存溢出的原因有很多,以下是常见的几种: 1、查询数据库的时候递归循环了,应尽量使用精简的关联 SQL ...
内存溢出配置是IT行业中,尤其是在Java应用开发与运维领域中的一个重要话题,它涉及到系统资源管理、性能调优以及故障排查等多个方面。标题与描述中重复提到“内存溢出配置”,这表明了对这一主题的关注与重视。接...
2. **使用Memory Analyzer(MAT)分析**:MAT是一款由Eclipse基金会开发的强大内存分析工具,可用于分析上述生成的堆转储文件。从提供的`MemoryAnalyzer-1.2.1.20121105-win32.win32.x86.zip`文件中解压并运行MAT,...
在生产环境中,持续监控Tomcat的内存使用情况,设置合理的JVM内存参数,并定期进行内存分析,以便尽早发现和解决问题。 通过以上步骤,我们可以利用MAT有效地诊断和解决Tomcat的内存溢出问题。理解MAT的使用方法...
在这种情况下,JVM为了帮助开发者分析问题,会生成一个堆转储文件(Heap Dump),如`heapDump.hprof`,该文件包含了JVM在特定时刻的内存快照,包括所有对象、类加载器、线程和内存分配等详细信息。 分析`heapDump....
通过本实验,旨在深入理解JVM内存管理机制以及各种内存区域的特点,并通过具体的编程实践来触发并分析这些异常,进而提升对Java应用程序性能调优和故障排查的能力。 #### 实验目标 1. **理解内存区域与内存区域...
【ha456.jar(IBMHeapAnalyzer)JVM内存分析工具】是一款由IBM开发的专业工具,主要用于诊断Java虚拟机(JVM)的内存问题。它能够解析和分析JVM生成的内存转储文件(通常称为heap dump或hprof文件),帮助开发者识别...
了解JVM内存结构及其功能对于优化Java应用程序的性能和排查内存问题至关重要。 首先,我们来详细探讨JVM的内存结构。在Java中,内存主要分为以下几个区域: 1. **程序计数器(Program Counter Register)**:每个...
JProfiler是一款专业的Java虚拟机(JVM)分析工具,它能够帮助开发者深入理解应用程序的性能瓶颈,优化内存管理,以及排查内存泄漏等问题。这款软件提供了丰富的功能,包括CPU使用率分析、内存分析、线程监控、类...
内存溢出(Memory Leak)是这类问题中的常见现象,可能导致服务崩溃,严重影响系统的稳定性和可靠性。本篇将详细介绍如何解决Tomcat内存溢出的问题,以及如何进行相应的配置优化。 首先,我们需要理解什么是内存...
此外,还可以使用JConsole、VisualVM等工具,更直观地监控和分析JVM内存使用情况,这对于性能调优和问题排查极为有益。 #### 结语 合理设置和调优JVM内存参数,是提高Java应用性能的关键所在。通过对JVM内存管理...
关于内存溢出导致的服务器崩溃问题分享 概述: 在生产环境中,服务器崩溃是非常常见的问题之一,而内存...内存溢出是非常常见的问题之一,需要我们细心排查和分析问题的原因,并采取相应的措施来防止该问题的发生。
本文将深入探讨MAT的使用、JVM GC的工作原理以及如何进行Mac环境下的内存分析。 MAT是一款非常实用的内存分析工具,它可以解析heap dump文件,展示详细的内存占用情况,包括对象实例、类、包和域等信息。通过MAT,...
内存溢出问题可以通过修改 JVM 启动参数、检查错误日志、对代码进行走查和分析、使用内存查看工具等步骤来解决。同时,也可以通过使用 Java 的内存管理机制来避免内存溢出,如使用分页查询、避免大循环重复产生新...
总结来说,面对Java IBM WebSphere的内存溢出问题,我们需要结合`javacore`和`deapdump`等诊断工具,通过分析脚本和相关库文件,理解内存管理原理,调整JVM配置,并优化代码,才能有效地排查和解决问题。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。需要检查代码中是否有可能引起内存溢出的问题,如死循环、递归调用、大循环重复产生新对象实体等。 第四步,使用内存查看工具动态查看内存使用情况。...