java内存溢出会生成啥文件?如何防止java内存溢出?

在java项目开发时,我们肯定会遇到java内存溢出的情况,要是Java应用程序卡顿或突然崩溃,八九不离十就是Java内存泄漏了,那java内存溢出会生成啥文件?下面来我们就来给大家讲解一下。

本地模拟内存溢出:

package com.cnhis.test.dump;
import java.util.ArrayList;
import java.util.List;
/**
* OutOfMemoryError内存溢出模拟测试
*/
public class OOMTest {
public static void main(String[] args) {
Listlist = new ArrayList<>();
while (true){
list.add("test");
}
}
}

idea设置VM参数

第一步:Edit Configurations

第二步:设置参数

第三步:dump文件生成,可以使用jstack、jmap、MAT等工具分析

注意:上面指定的dump输出文件夹“D:\dumpTest”必须存在,idea不会去创建

· 参数说明

-Xms:表示初始化堆内存

-Xmx:表示最大堆内存

-XX:+HeapDumpOnOutOfMemoryError 表示jvm发生oom异常时,自动生成dump文件

-XX:HeapDumpPath= 表示生成dump文件的存放目录

如何防止java内存溢出?

最常见的内存泄漏类型之一是Java中的对象随着时间的推移而创建,但从未释放。提高性能和防止内存泄漏的一个简单方法是检查代码中静态字段的使用情况。

当您将Java中的任何对象设置为静态时,它会自动将该对象的生命周期附加到JVM本身,因此垃圾收集器从不清除它。正如您可以想象的那样,如果您有许多大对象被设置为静态的,这会在您的代码中造成相当大的问题。

一定要检查static和collections的所有用法。这两者都是导致Java内存泄漏和意外占用内存的最常见原因。

Java内存泄漏的另一个常见原因是存在未关闭的连接。代码中保持连接打开而不关闭连接的任何部分都可能导致内存过度使用。未闭合连接最常见的罪魁祸首是http调用、stream流、FTP站点和数据库访问。

当保持打开状态时,连接会迅速导致堆内存膨胀,并最终导致应用程序崩溃。若要解决此问题,请始终确保在代码中指定了关闭连接的时间。

就像未关闭的连接一样,未关闭的流会导致非常类似的内存泄漏和资源问题。如果未选中,则打开的流将增加堆内存使用量,以达到临界级别,并最终崩溃。在旧版本的Java中,流必须手动关闭,但是现在使用try with resources语句,这可以自动实现。

虽然寻找这些具体的例子可能会有所帮助,但每个程序的编码都是不同的,需要采用不同的方法。如果您要手动查看代码,启用详细的垃圾收集可以帮助您更好地了解哪些内容正在被收集,哪些内容没有被收集。

添加-verbose:gc参数到配置将准确地输出垃圾收集工具正在执行的操作,并让您深入了解可能需要修改的内容。这是一个简单的技巧,但仍然需要你的时间和精力来筛选结果。

对代码进行可靠的审核还可以发现阻碍性能或导致内存泄漏的潜在问题。虽然这看起来很费时,但这通常是处理所有代码的最佳实践,并有助于避免严重的麻烦。

总之我们需要知道java内存溢出的原因,这样就能避免java内存溢出,在一定程度上减少影响java运行!最后大家如果想要了解更多java常见问答知识,敬请关注奇Q工具网。

推荐阅读:

sql语句group by用法是什么?sql有哪些重要命令?

fastjson如何配置safemode?safeMode场景如何做autoType?

springmvc和servlet的区别是什么?Springmvc如何进行参数传递?