JVM堆内存释放不及时问题

简介: JVM堆内存释放不及时问题

线上问题:

1.线上每天定时读取文件(大文件)成MAP,并加载入库,当执行完最后一批 批量提交sql 时,JVM堆内存没释放;

2.因为加了以下堆内存检测,所以,下一次处理文件时,发起不了新的线程处理新任务;

public boolean exceedSize() {

MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();

LOGGER.info("堆内存信息: " + memoryBean.getHeapMemoryUsage());

return memoryBean.getHeapMemoryUsage().getUsed() / 1000 > heapSizeThreshold; // heapSizeThreshold = 3G

}

3.JVM参数配置:-Xms6144M -Xmx6144M -XX:+UseG1GC -XX:ParallelGCThreads=5 -XX:G1HeapRegionSize=32m -XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=800

问题认识:

1.当线程处理完,堆内存没有触发释放的条件

2.之前看过的把xmx和xms设置一致可以让JVM在启动时就直接向OS申请xmx的commited内存,


好处是:

1)避免JVM在运行过程中向OS申请内存

2)延后启动后首次GC的发生时机

3)减少启动初期的GC次数

4)尽可能避免使用swap space

坏处:

堆内存释放不及时

解决方案:

第一、设置-Xms6144M -Xmx6144M参数为:-Xms1024M -Xmx6144M

第二、在发起线程前,检测堆内存时,Object obj = new Object(); // 触发垃圾回收

其他:

上线前,应尽可能准确估计上线情况,做压力测试,使用jdk自带的监控工具多做分析;上线后,不断迭代优化;可以考虑设置MaxHeapFreeRatio/MinHeapFreeRatio参数

目录
打赏
0
0
0
0
10
分享
相关文章
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
162 29
JVM简介—1.Java内存区域
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
719 166
|
5月前
|
散列表的数据结构以及对象在JVM堆中的存储过程
本文介绍了散列表的基本概念及其在JVM中的应用,详细讲解了散列表的结构、对象存储过程、Hashtable的扩容机制及与HashMap的区别。通过实例和图解,帮助读者理解散列表的工作原理和优化策略。
91 1
散列表的数据结构以及对象在JVM堆中的存储过程
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1007 1
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
2月前
|
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
37 6
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型
堆内存分配策略解密
本文深入探讨了Java虚拟机中堆内存的分配策略,包括新生代(Eden区和Survivor区)与老年代的分配机制。新生代对象优先分配在Eden区,当空间不足时执行Minor GC并将存活对象移至Survivor区;老年代则用于存放长期存活或大对象,避免频繁内存拷贝。通过动态对象年龄判定优化晋升策略,并介绍Full GC触发条件。理解这些策略有助于提高程序性能和稳定性。

热门文章

最新文章