声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利
可能较多数量的对内存泄露的错误判断来自会话部分。会话部分并不会泄露任何内存。它消耗内存,表面上很像内存泄露,但最终会话内存还是会被回收的。如果应用服务器内存溢出,要想知道这个溢出情况是由于内存泄露引起的还是由于对会话管理不善造成的,最好的办法是停止对应用服务器的请求,直至会话都失效后来观察内存是否已经被回收。显然,在生产环境下不太可能做这样的监控,但使用这种办法来判断到底是因为会话内容太多还是因为内存泄露造成内存溢出是肯定不会有问题的。
总的来讲,如果应用中过分使用了会话,则正确的解决之道就是调整应用的会话应用来降低内存的开销。以下办法可以将超大会话的影响降到最低:
加大支持会话的堆尺寸
减少会话失效时间
尺寸越大的堆就会花更长的垃圾收集时间,所以并不是最佳的解决方案,但是总比内存溢出强些。增加堆的尺寸以支持会话在其生命周期内驻留可能需要足够多的内存,计算方法是:活动用户的会话内存量+会话失效周期内的会话内存量。如果业务逻辑允许,降低会话失效时间可能是更好的选择。
总之,以下是按照优先级排列的解决步骤:
调整应用减少会话内存用量
鼓励最终用户及时登出系统
强制降低会话失效时间
增大堆尺寸
但是,在应用范围内的变量(application)、静态变量和长期生存的类都是真正需要在内存分析器中分析内存泄露的点。
永生代异常
JVM中永生代在处理内存中的用途往往被误解了。堆本身只携带类实例,但在JVM能真正创建堆上的类实例时,必须先要将字节码(.class)加载到处理内存中来。这样才能使用这些字节码在堆中创建类对象。JVM把类的不同版本的字节码存放在永生代中。下图即是永生代和堆的关系图。永生代在JVM处理内存的内部,并不属于堆。
通常,可能希望永生代能足够大,大得能容纳应用中所有的类,因为这些类显然会被实例化,而且从磁盘系统里面读取的代价要比从内存中读取的代价昂贵。JVM使用-noclassgc调优选项来确保类不会从永生代中卸载。该选项不让垃圾收集在永生代中运行。这个选项固然好,但有一个问题就是如果永生代满了会如何?根据我的观察,JVM会检查永生代来确定其是否需要内存,因此就会触发一个大规模的垃圾回收。但垃圾回收清理堆中的内存,如果加上了-nocloassgc,就不会动永生代的空间,所以这也是徒劳无果的。完成垃圾回收后,JVM又去查看永生代空间,发现还是没有空间,于是就一遍一遍又一遍地执行垃圾回收!
我第一次遇到这个问题时,就是系统的性能极端低下,经过一段时间后就会内存溢出。经过对详细垃圾回收日志、堆空间利用和处理内存利用图,很快就发现堆中的情况正常,但是处理内存溢出了。该系统中有数千个类和JSP页面,再加上-noclassgc选项,永生代就产生了异常的情况。做调优处理时可以将永生代空间加大,并去掉-noclassgc的JVM选项。
如上图所示,当永生代空间充满后,就会触发大规模的垃圾回收,将Eden和生存空间的对象清理到老生代中去。但如果加上-noclassgc选项,则不会对永生代的空间进行回收。
未完待续……
Java EE应用中的性能问题解决方案参考资料下载
声明:本文禁止未经本人同意的任何形式转载!如有转载需求,可与本人通过个人资料中的电子邮箱联系。对于未经同意的转载,本人将保留进一步行动的权利!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/BU_BetterYou/archive/2008/05/30/2495265.aspx
分享到:
相关推荐
JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...
理解并解决Java内存溢出问题对于优化应用性能、提高系统稳定性至关重要。 首先,我们需要了解Java内存模型。Java虚拟机(JVM)将内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器...
Java内存溢出问题通常指的是Java应用程序在运行过程中由于内存分配不当或使用过度导致JVM无法分配更多的内存,从而抛出`java.lang.OutOfMemoryError`异常。本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. ...
Java内存溢出的详细解决方案 Java内存溢出是指Java虚拟机(JVM)中的内存使用超过了最大限制,导致程序崩溃或无法正常运行的错误。Java内存溢出主要有两种类型:PermGen space和Java heap space。 PermGen space ...
Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack...同时,保持对JVM和应用性能的持续监控是预防和解决内存溢出的关键。
内存溢出问题在Java开发中是一个常见的问题,尤其是在使用集成开发环境如MyEclipse时,由于资源消耗较大,可能会频繁出现。本文主要讨论如何解决MyEclipse中的内存溢出问题以及相关的Java内存管理知识点。 首先,...
JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题可以调整容器参数来解决...
在Java开发中,处理大型Excel文件时,可能会遇到内存溢出的问题。这通常是由于Java的默认内存设置不足以处理大量数据导致的。本解决方案主要针对使用Apache POI库进行Excel读取时遇到的这类问题。 首先,Apache POI...
1. **大数据量处理**:当Kettle处理大量数据时,如在表输入、表输出、聚合、Join、过滤等步骤中,如果一次性加载太多数据到内存,可能会超出JVM的堆内存限制。 2. **内存管理不当**:Kettle的默认配置可能不适合特定...
在Java编程中,"java heap space"内存溢出是一个常见的问题,它通常发生在应用程序尝试分配超过JVM堆内存限制的对象时。这个问题对于任何Java开发者来说都至关重要,因为如果不妥善处理,可能会导致程序崩溃。以下是...
在Java开发中,当面临大批量数据导出到Excel文件时,可能会遇到内存溢出的问题。这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行...
本文主要讨论了 JVM 中的内存溢出问题,包括内存溢出的定义、内存泄漏和内存溢出的区别与联系、JVM 垃圾回收机制、内存溢出的原因分析、常见的四种内存溢出情况以及解决方案。 一、内存溢出的定义 内存溢出是指...
在Java编程中,内存溢出(Out of Memory Error,简称OOM)是一个常见的问题,它发生在程序请求的内存超过了系统能够分配的最大额度。这种情况通常会导致程序崩溃,因此理解如何解决Java程序的内存溢出至关重要。以下...
Java 中的内存溢出和解决方案 Java 中的内存溢出是一种常见的错误,可能会导致程序崩溃或hang死。了解 Java 中的内存溢出原因和解决方案是非常重要的。本文将介绍 Java 中的几种常见的内存溢出和解决方案。 1.JVM...
标题 "某应用内存溢出(暨jvm)分析分享" 提到的是一个关于应用程序,特别是N银行消费信贷backend应用的内存溢出问题及其在Java虚拟机(JVM)层面上的分析。内存溢出是程序运行时由于分配的内存不足导致无法继续执行...
JAVA中OutOfMemoryError(内存溢出)的三种情况及解决办法 Java中的OutOfMemoryError(内存溢出)是一种常见的错误,本文将详细介绍OutOfMemoryError的三种情况及其解决方法。 首先,我们需要了解JVM(Java虚拟机...
综上所述,解决JVM运行时内存溢出问题需要从多个角度进行:合理调整JVM内存参数、优化索引构建算法、监控系统状态并进行必要的硬件升级,甚至考虑采用分布式计算。只有这样,我们才能确保搜索引擎在创建索引时高效、...
### JVM内存溢出详解 #### 一、基本概念与理解 **JVM内存溢出**是一种常见的运行时错误,指的是程序在执行过程中因为...通过以上详细的分析和策略,可以有效地预防和解决JVM内存溢出问题,提高程序的稳定性和性能。
总之,掌握如何在Java中获取和管理JVM内存大小,是每一个Java开发者都应具备的基本技能之一。通过合理利用`Runtime`类提供的API和灵活调整JVM的启动参数,可以有效地提升应用程序的性能和用户体验。