博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一次JVM内存调优过程
阅读量:5357 次
发布时间:2019-06-15

本文共 634 字,大约阅读时间需要 2 分钟。

项目中,有个同事写的JOB,使用到查询数据库大量历史协议数据(大概300W左右),由于对存放数据的list或map没有做“用完即时声明释放”。

导致此Jar部署在windows service后,进程的内存资源一直居高不下,而且多次执行后,JVM内存终于增长超过最大JVM内存设置max=3GB,

从而导致程序报错“内存溢出OutOfMemoryException”提示。

 

解决思路如下:

1. 修改代码中:大数据的list和map的用完之后,增加声明释放资源代码:list.clear()和list =null;

2. 修改jvm命令:增加jvm管理GC回收策略的参数,如:-Xmx2048m -XX:MaxGCPauseMillis=100 -XX:+UseParallelOldGC -XX:+UseParallelGC

 

然后,删除之前注册的windows service (寄宿jar的java程序),重新注册和启动jar的windows service服务,测试结果发现:

此JOB的jvm内存使用就会自动在list和map使用完毕之后,快速回收占用的内存资源。

并且不管多次运行JOB,也不会提示内存溢出的异常。

 

图1:修改前,每次执行完JOB,其进程的内存资源一直没有释放,如下图

 

图2:修改后,每次执行完JOB,其进程的内存资源会快速释放,如下图

 

转载于:https://www.cnblogs.com/itshare/p/9210028.html

你可能感兴趣的文章
python 数值计算库
查看>>
java 服务重启 js 中被注释代码仍然执行
查看>>
我并不是不闻不问![C#]
查看>>
web前端经典小题
查看>>
AutoCAD如何倒角 倒圆角 倒直角
查看>>
Office PPT中如何插入flash
查看>>
C# Fade Form Effect With the AnimateWindow API Function
查看>>
golang多维数组的切片
查看>>
IP 网际协议
查看>>
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>
jquery 获取css position的值
查看>>
面向对象的程序设计
查看>>
a标签添加点击事件
查看>>
Context.startActivity出现AndroidRuntimeException
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>