如果我故意创建了一个在遭受内存泄漏的情况下处理数据的应用程序,我会注意到报告的内存,例如:
Runtime.getRuntime().freeMemory()
Run Code Online (Sandbox Code Playgroud)
开始在1到2 MB的可用内存之间振荡.
然后应用程序进入如下循环:GC,处理一些数据,GC等,但由于GC经常发生,应用程序基本上不再做太多其他事情了.甚至GUI也需要年龄才能做出响应(而且,不,我不是在谈论EDT问题,它实际上是VM基本上停留在一些无休止的GC'模式).
我想知道:有没有办法以编程方式检测到JVM没有足够的内存?
请注意,我不是在谈论内存错误,也不是在检测内存泄漏本身.
我正在谈论检测到应用程序运行的内存如此之低,以至于它基本上都在调用GC,几乎没有时间做其他事情(在我的假设示例中:处理数据).
例如,它是否可以重复读取在一分钟内可用的内存量,并且看到如果数字在不同值之间"振荡",例如4 MB,则得出结论是存在一些泄漏并且该应用程序已无法使用?
您可以将参数传递给 java 虚拟机,该虚拟机为您提供 GC 诊断,例如
-verbose:gc该标志打开 GC 信息的记录。适用于所有 JVM。
-XX:+PrintGCTimeStamps打印相对于应用程序启动发生 GC 的时间。
如果您在文件中捕获该输出,则在应用程序中您可以定期读取该文件并解析它以了解 GC 何时发生。这样你就可以算出每次GC之间的平均时间