从问题Creating a memory leak with Java开始,有许多方法可以在Java中创建内存泄漏,但我只是想创建一个简单的内存泄漏并能够以某种方式观察其效果。事实上,在尝试创建内存泄漏后,我想验证(数字或其他),以便我确保已成功创建内存泄漏。 我们是否可以通过不使用第三方应用程序来调查代码中内存泄漏的发生,只需插入例如我们的代码中的runtime.maxMemory()?
答案 0 :(得分:3)
这是一个穷人替代内存分析工具:
public static long bytesOccupied() {
final Runtime rt = Runtime.getRuntime();
for (int i = 0; i < 2; i++) rt.gc();
return rt.totalMemory()-rt.freeMemory();
}
我已经多次使用它,并且可以证明它至少在某些设置上有效。试一试,看看它是否能给你带来明智的效果。
否则,启动VisualVM非常容易,VisualVM已经安装在您的计算机上使用JDK。一定要安装可选的VisualGC插件。让你的代码在循环中做一些分配,并观察GC代流失。使用较短的采样时间(100或200 ms)来获得实时感觉。
答案 1 :(得分:0)
在 IntelliJ 中打开项目。 配置错误警告。 打开项目的任何类后,使用右上角的代码检查警告弹出窗口访问“配置检查”按钮。
在新选项卡中,在“内存”和“资源管理”组中,将其严重性级别更改为“错误”。
执行分析:
Menu Analize > Inspect Code.
这将在窗口底部打开一个“问题”视图选项卡。
检查我们之前更改了严重性的那些错误。 列出所有这些。 分析它们是否有意义,或者它们是否可以被忽略。 (这可能需要一些时间)
列出所有这些。
从列表中删除任何不适合修复的错误。
在 Eclipse 中打开项目。 配置错误警告。
Menu Window > Preferences > Java > Compiler > Error/Warnings
在新选项卡中,将“潜在编程问题”中的所有选项标记为错误。
为了执行分析,清理以前的构建并制作另一个。 Eclipse 将执行分析。 (确保在“项目”菜单中将自动构建设置为“开启”)
Menu Source > Clean up...
这将在窗口底部打开一个“问题”视图选项卡。您可以将此“报告”从 Eclipse 复制并粘贴到您的列表中,但要进行视觉调整。
检查我们之前更改了严重性的那些错误。 将它们包括在列表中。 分析它们是否有意义,或者它们是否可以被忽略。 (这可能需要一些时间)
从列表中删除任何不适合修复的错误。
如果您在寻找更明显的错误时发现任何类中潜伏着任何额外的错误,请将它们添加到列表中。像搜索“流”一样搜索它们,如下所示。
进行最后一轮搜索。使用:
Ctrl+Shift+F (in IntelliJ)
在一个接一个模块中搜索“import ...bad class...”、“stream”(必须这样做)或您可能发现的任何新的微妙问题。
使用模块作为您的搜索单元将使您比其他排序选项更有条理,并使您更快地完成项目。
最后,修复列表中的所有问题。它们可能是 try/catch/finally、try-with-resources 或其他一些解决方案之王。