内存问题错综复杂,本人水平也有限,浅薄之见仅供参考。
一、GC监控
GC日志记录了内存使用和回收状态,出现内存故障时,可作为分析排查手段。
1. 启用GC监控的方法:增加java启动参数-verbose:gc,输出信息的样例:
引用
GC 135: total final references 4390; cleared final references 8.
GC 135: total phantom references 0; cleared phantom references 0.
GC 135: total old soft references 0; cleared old soft references 0.
GC 135: total JNI global weak references 0; cleared JNI global weak references 0.
GC 136: starting collection, maximum allocation reached.
GC 136: live objects 1081046; collected objects 6038; collected(KB) 558.
GC 136: queued for finalization 0; total soft references 113; cleared soft references 18.
GC 136: current heap(KB) 716784; current threshold(KB) 262144.
GC 136: collect (milliseconds) 1314.
GC 136: current cycle allocation(KB) 0; previous cycle allocation(KB) 532.
GC 136: total weak references 1321; cleared weak references 0.
2. 将GC日志输出到文件:不同JDK设置的参数不同,参考JDK官方文档
SUN:-Xloggc:filename (例如:-Xloggc:D:/gc.log)
IBM:-Xverbosegc:file=filename 或 -Xverbosegclog:filename
HP :-Xverbosegc=filename
3. 如何设置Java启动参数:有多种方式,以下各举一例
Tomcat:在catalina.bat的“set JAVA_OPTS=%JAVA_OPTS% ”后设置
WebLogic:在startWebLogic.cmd的“%JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% ”后设置
WebSphere:进入管理控制台,应用服务器->进程定义->Java虚拟机高级定义
4. GC日志的图形分析工具:HP的jtune
二、内存问题描述
典型现象是系统运行一段时间后,报OutOfMemoryError错误、页面非常慢、不响应或完全不再接受请求,而此时通过观察JVM内存,发现内存急剧上升到最大值并居高不下。
这种问题出现后,往往很棘手,通常是由于应用程序不合理造成的,而不合理程序或内存泄漏的源头可能并不明显。本人的一次经历是,经过十多天各种测试手段后,最后确定问题是由一处String累加引起的,改成StringBuffer就解决了,可见,忽略“小问题”往往会带来大麻烦。
三、分析手段
1. 分析GC日志、系统日志
2. 程序中设置监控断点
3. 尽可能重现故障并同时监控JVM内存,找出引起内存急剧上升的规律
4. 检查关键程序或频繁使用的工具类的合理性
四、解决手段
1. 主要从程序入手:降低内存使用量;字符串累加时以StringBuffer代替String;随时释放不再需要的对象;SQL优化及避免频繁取出大量数据;Session中不要放大的数据。。。
2. 据WebSphere和WebLogic官方建议:通常情况下JVM的Heap最小值和最大值可设成一样(根据实际情况调整),可取系统内存的25%-75%,保证JVM有合理足够的内存大小
3. 应用服务器的其他优化措施
五、应急措施
1. 不设定JVM的最大Heap上限
2. 程序中判断内存吃紧时执行Runtime.gc()强制垃圾收集,此方式比自动收集彻底,可一定程度上改善内存利用效率
3. 在不影响业务的情况下,定期重启应用服务器
分享到:
相关推荐
VisualVM和GCViewer是强大的JVM监控工具,能够显示实时的内存使用情况、垃圾收集日志和性能指标,帮助诊断内存问题。 8. **内存溢出类型** - **堆内存溢出**:当堆不足以分配新对象时发生。 - **非堆内存溢出**...
JProfiler对应用服务器内存泄漏问题诊断解决方案 一、概述 本文主要介绍如何使用 JProfiler 对应用服务器内存泄漏问题进行诊断和解决。内存泄漏是指应用服务器中的一种常见问题,表现为内存长期不合理占用,内存...
### 超实用内存溢出解决方法 #### 内存溢出概述 内存溢出(Out Of Memory,简称OOM)是指程序在运行过程中申请的内存超过了系统能提供的最大内存限制,导致程序无法继续正常执行的现象。内存溢出分为堆内存溢出、非...
### Android内存泄漏解决方案 #### 一、概述 在Android应用开发过程中,内存管理是一个非常重要的环节。不当的内存管理不仅会导致应用性能下降,甚至可能导致应用崩溃。为了有效地管理和避免内存泄漏,开发者需要...
### Eclipse启动Tomcat内存泄漏解决方案 #### 一、问题背景 在使用Eclipse集成开发环境(IDE)启动Tomcat服务器时,可能会遇到内存泄漏的问题。这种情况不仅会导致应用程序运行缓慢,严重时甚至会使得Tomcat服务器...
- **解决方案**:调整JVM参数(如-Xp和-Xk)以优化内存布局,或者升级到更高版本的JVM,例如IBM JDK 1.5,该版本改进了GC算法并减少了内存碎片问题。 #### 四、Websphere内存溢出的诊断与解决方法 1. **启用进程...
#### 四、常见问题及解决方案 ##### 1. **内存泄漏** - **表现形式**:应用运行一段时间后,内存占用持续增加,即使经过GC也没有明显改善。 - **解决方案**: - 使用`jmap`生成heap dump文件。 - 使用MAT...
- 实际应用中的GC问题诊断,例如内存泄漏、长时间的Full GC、Stop-the-world事件等。 - 通过调整JVM参数解决性能问题的实例。 通过深入学习JVM体系结构和GC调优,开发者可以更好地理解和控制Java应用的内存使用,...
通过以上步骤,开发者可以利用VisualVM有效地管理和监控JVM,及时发现并解决性能问题,提高Java应用的稳定性和效率。无论是本地还是远程,VisualVM都是一个强大且易用的JVM工具,值得在日常开发和调优工作中使用。
#### 知识点五:解决内存溢出问题的方法 1. **增加堆内存大小**: - 可以通过调整`-Xms`和`-Xmx`参数来增加堆内存的初始大小和最大值。 2. **优化代码**: - 减少不必要的对象创建,比如使用局部变量而非全局...
7. **定期监控和调整**:实施持续的性能监控,定期进行内存分析,及时发现并解决问题。在生产环境中,应有完善的监控机制,一旦发现内存异常增长,能立即触发警报并采取措施。 8. **最佳实践**:遵循最佳实践,如...
然而,这种方法无法解决循环引用的问题。 2. **标记-清除(Mark-Sweep)**:此算法分为两个阶段,首先标记所有被引用的对象,然后清除未被标记的对象。这种方式简单但会导致内存碎片化问题。 3. **复制(Copying)...
如果频繁触发Full GC,可能表明内存分配有问题。 - 利用JMX监控JVM的内存使用情况,观察内存使用趋势,查找异常增长。 - 结合MAT分析heap dump,找出长期驻留在老年代的对象,这些可能是内存泄露的迹象。 4. **...
### OutOfMemoryError 解决方法 #### 一、概述 在软件开发过程中,尤其是在Java应用服务器(如Tomcat)上部署的应用程序中,经常会遇到内存溢出问题(`OutOfMemoryError`)。这种错误通常发生在虚拟机无法分配足够...
- **常见问题解决方案**:针对安装配置过程中的常见问题提供解决思路和技术支持信息。 **6. 实战案例** - **案例分析**:通过具体的实战案例,展示Oracle 12c数据库管理的实际应用效果,帮助读者更好地理解并掌握...
- **电源系统问题故障处理**:针对电源方面可能出现的问题给出解决方案。 - **设备故障处理**:提供了一些常见的故障排查方法,帮助用户快速定位并解决问题。 综上所述,DPtech ADX3000-GC应用交互交换网关不仅在...
了解JVM内存模型对于开发者来说至关重要,因为它有助于识别和解决性能问题,如内存泄漏、栈溢出和垃圾收集效率低等问题。通过优化内存分配、管理对象生命周期和理解垃圾收集机制,我们可以显著提高Java应用的效率和...
4. 解决方案:针对找到的内存泄露,编写修复代码并进行测试,确保泄漏被有效解决。 内存泄露的分析与处理是一个复杂的过程,需要多方面的知识和工具的协助。对于Java开发者而言,深入理解内存管理机制、掌握内存...
IBM Java堆内存分析工具——HeapAnalyzer,是一款专为IBM J9 VM设计的强大内存分析工具,它可以帮助开发者深入理解Java应用程序的内存使用情况,检测并解决内存泄漏问题,从而提升应用性能。本文将详细介绍Heap...