本文主要介绍如何在项目中解决java堆空间的问题。通过示例代码进行了非常详细的介绍,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面和边肖一起学习。
起因
17年的一个项目,OOM(java堆空间)有问题。现在出现了一个问题:法院工程连不上外网。一旦连上外网,高院会直接定位电脑,报警(文件保密)不能远程,只能通过视频教他们怎么做。一路跟店员讲代码真的很累==
过程
这个过程无疑很难养成一个不太懂记忆的毛病。搜索后发现是内存溢出导致的,于是开始解决。
网上大多数人都说运行内存要调整。我也试过这个,但是没用。具体操作流程如下。
设置-xms 256m-xmx 512m-xx:permsize=64m-xx:maxperm size=256m异常,然后调整参数-Xms512m -Xmx1024m也没有解决,最后调整到2G也没有解决。以上都在GUI界面进行了修改,因为服务安装在那里,至于在线服务,据说修改了注册表和catalina.sh或者
在这种情况下,我们只能优化代码,启动项目,监控堆和内存操作。操作如下所示
首先,打开jdk自带的jdk下的内存监听器(jdk/bin/jvisualvm.exe)。如果您的项目已经打开,该工具将显示tomcat的运行状态。
你只需要监控CPU和内存,CPU会显示CPU运行和GC处理频率。内存会在运行时显示堆中数据的变化,比如对象实例。
向内存溢出的模块发送请求。如果有什么异常,可以监测一下。我的是一次加载太多数据,实例化对象太多导致堆里年轻一代和老一代数据被占用。
我重新出现了,堆里出现了一个非常高的点,就是加载了树型结构,然后突然就倒了,因为JVM的时间都花在了GC上,java堆空间出现了。CPU还可以直观地看到垃圾收集活动有一个高峰。
我们来看看堆峰值的数据,创建300万个ArrayList和TreeVO对象。
根据这些,我们知道了代码中的问题,代码中有一个块调用了这样的代码。让我们来看看。这里创建了ArrayList和TreeVO,ArrayList和TreeVO有很强的引用关系,GC无法清除,导致OOM。
一旦知道了问题,就可以修改了。一步一步来看,由于查询条件的限制,比如直接查询所有文件,可以追溯到上面的方法,而且由于数据有几万条,每个可以创建300W个对象。数据库删除排序条件,问题解决==
这里不理想。TreeVO应该放在循环外部,在循环内部实例化对象,最后释放对象和集合。
总结
终于问题解决了,这也是很少见的使用真实内存的问题,史诗级。
现在的开发者很容易就能写出代码,往往忽略了最重要的基础。
看书是必不可少的(因为我最近在看《深入理解java虚拟机》,不然怎么知道JVM检查内存?)
网上有很多关于记忆的解释,但都不够全面。如果你想了解这个系统,读一本书。
这篇关于如何解决项目中java堆空间问题的文章到此为止。有关java堆空间的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。