声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利!
Java EE的应用,无论部署至哪种应用服务器上,都可能遇到一些性能的问题。在此,我们将介绍一些通用的性能问题及解决方案。在性能调整和优化中,首先需要了解客户的问题。通过架构、现象等方面寻找可能影响Java EE性能的可能方面。所以本文中列举的是一些通用的问题,在实际的性能调整和优化中需要结合具体的情况来进行分析判断并做出相应调整。
内存溢出错误
最经常遇到的问题可能就是OutOfMemoryError了。这个错误经常缠绕着一些企业应用,让系统管理员觉得很可怕。通常,这个错误是以下一些现象的并发症:
应用服务器宕机
性能大幅降低
表象上出现无休止重复的垃圾收集,致使正常处理中断,并还可能造成应用服务器宕机
无论是什么现象,可能都需要重启应用服务器可能才能恢复正常。
导致内存溢出的原因
在解决内存溢出的错误前,首先要理解这是如何产生的。如果JVM在其进程内存空间没有内存可用(包括堆的各个区域、永久内存空间),而一个进程试图创建一个新的对象实例,垃圾收集线程就开始尝试释放足够的内存空间来放置新的对象。当垃圾收集线程无法释放足够的内存时,就抛出OutOfMemoryError。
内存溢出错误最有可能是由于Java的内存泄露造成的。有很多关于Java内存泄露的讨论,最后的定论就是Java的内存泄露来源于对未使用对象引用的延迟释放:也就是说已经完成了对该对象的使用,但是因为还存在着一个或者多个对象引用着该对象,所以垃圾收集线程就不能收回该片内存。由该对象占有着的内存即导致了可用堆空间的流失。这样的内存泄露通常发生在Web请求阶段,例如10000个用户并发访问,而每个请求中有一个或两个存在内存泄露的对象就有可能导致服务器崩溃。更为甚者的是,一般来说,发生内存泄露的对象都不是简单的对象(例如Integer、Double),而是在堆中要占据很多“子图”的对象。例如,有可能在不经意间引用了Person的对象,而Person的对象又引用了Profile的对象,而Profile的对象又引用了好几个PerformanceReview的对象。比起Person对象占据的100字节内存来说,在这个情况下完整的“子图”对象可能占据500K或者更多的内存。
为了从根本上解决问题,需要判断是真实存在内存泄露还是别的内容引起的OutOfMemoryError。有如下几个判断方法:
分析底层的内存统计信息
检查堆增长的方式
虽然Sun和IBM的JVM不一样,JVM的调优过程却有很多相同之处。
SUN JVM的内存管理
Sun的JVM是有“代沟”的(开玩笑,应该说是按代分片的),也就是说在一个空间(分片)中创建的对象在真正进入长期空间前都有好几次销毁的机会。Sun的JVM被明确地分成以下几个空间(分片):
新生代,包括Eden和两个生存空间(From空间和To空间)
老生代
永生代
如下图:
对象在Eden空间中创建,当Eden满后,垃圾收集线程遍历Eden中的所有对象,将活动对象拷贝至第一个生存空间,并将废对象的空间回收释放。当Eden再次充满时,垃圾收集线程就再来一遍,但将活动的对象拷贝至第二个生存空间,并将原来在第一个生存空间中的对象拷贝到第二个生存空间。如果第二个生存空间冲满后,一些留在Eden和第一个生存空间的对象就会被拷贝到老生代。当垃圾收集通过这种轻量级的方法(也称为“拷贝收集法”)不能获得足够内存的话,垃圾收集就会执行一次大规模收集,也叫“停滞收集法(stop-the-world collection)”。在这种收集法下,垃圾收集将所有线程挂起并在全堆范围内执行标记清扫收集,腾空整个新生代并准备重新开始进程。
拷贝收集法的运行方式图:
停滞收集法的运行图:
总的来说,对象在新生代创建,大部分都在此进行轮回,并不需要执行标记清扫收集。有一些对象上升至了老生代,因为它们活动的时间太长了,如果老生代也满了,就必须来一次标记清扫收集了。
可以看出,在Sun的实现中,老生代中的对象只能通过大规模的收集活动来收集,所以代价很高。所以需要确保对象生存的时间较短,这样在其还未进入老生代的时候就将其收集。
Java EE应用中的性能问题解决方案参考资料下载
声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/BU_BetterYou/archive/2008/05/27/2487241.aspx
分享到:
相关推荐
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
Java内存溢出问题通常指的是Java应用程序在运行过程中由于内存分配不当或使用过度导致JVM无法分配更多的内存,从而抛出`java.lang.OutOfMemoryError`异常。本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. ...
内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...
理解并解决Java内存溢出问题对于优化应用性能、提高系统稳定性至关重要。 首先,我们需要了解Java内存模型。Java虚拟机(JVM)将内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器...
JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决...
Java内存溢出的详细解决方案 Java内存溢出是指Java虚拟机(JVM)中的内存使用超过了最大限制,导致程序崩溃或无法正常运行的错误。Java内存溢出主要有两种类型:PermGen space和Java heap space。 PermGen space ...
Java 中的内存溢出和解决方案 Java 中的内存溢出是一种常见的错误,可能会导致程序崩溃或hang死。了解 Java 中的内存溢出原因和解决方案是非常重要的。本文将介绍 Java 中的几种常见的内存溢出和解决方案。 1.JVM...
在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...
在Java开发中,当面临大批量数据导出到Excel文件时,可能会遇到内存溢出的问题。这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行...
标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...
Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack...同时,保持对JVM和应用性能的持续监控是预防和解决内存溢出的关键。
最后,监控系统性能和Kettle日志也是解决问题的关键,它可以帮助我们了解内存使用情况,及时发现并解决问题。同时,理解数据处理的瓶颈,选择合适的硬件配置和软件配置,都是预防和解决Kettle内存溢出问题的重要手段...
标题中的“关于tomcat乱码以及tomcat jvm 内存溢出问题的解决方案和理论”涉及了两个关键的IT概念:Tomcat服务器的字符编码问题和Java虚拟机(JVM)内存管理的问题。让我们逐一深入探讨这两个主题。 首先,我们来...
Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...
总之,掌握如何在Java中获取和管理JVM内存大小,是每一个Java开发者都应具备的基本技能之一。通过合理利用`Runtime`类提供的API和灵活调整JVM的启动参数,可以有效地提升应用程序的性能和用户体验。
### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。
Java内存溢出(Out of Memory,OOM)是Java应用程序中常见的问题,会导致程序崩溃或性能急剧下降。HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍...
本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和内存溢出的区别与联系、JVM 垃圾回收机制、内存溢出的原因分析、常见的四种内存溢出情况以及解决方案。 一、内存溢出的定义 内存溢出是指...
JAVA内存溢出 JAVA中OutOfMemoryError(内存溢出)的三...OutOfMemoryError是Java开发中的一种常见错误,了解JVM的内存管理机制和OutOfMemoryError的三种情况及其解决方法,对于解决Java开发中内存溢出问题非常重要。
在Java中,主要分为堆内存溢出(Heap Space OutOfMemoryError)和永久代/元空间溢出(PermGen/MethodArea OutOfMemoryError)。其中,堆内存用于存储对象实例,而永久代或元空间则主要用于存储类的元数据。 ### 2. ...