【问题标题】:What should I tweak on my Java application so it stops crashing?我应该对我的 Java 应用程序进行什么调整以使其停止崩溃?
【发布时间】:2019-01-21 07:43:46
【问题描述】:

无论我分配多少内存 4、8 或 10 Gig,我的应用程序都会消耗大部分内存 - 96% - 每隔几天就会停止,因为它没有足够的内存来GC。

我们正在监控和触发手动 GC 以减轻痛苦,但我希望 JVM 能够自行预测这一点并在适当的时候进行 GC。

在 80% 时我应该考虑哪些标志来触发 GC - 这种坦率的方法是否正确?

【问题讨论】:

  • 你走错了路。追查内存泄漏而不是治标不治本。
  • 我宁愿建议你生成一个堆转储来分析内存泄漏问题
  • @NicolasB 不要尝试自己触发 GC。最多你可以“请求”它运行。但是,在内心深处,GC 有点乱。 GC 本身将决定何时运行,甚至是否运行。您不能自己触发它,并确保它实际运行。

标签: java garbage-collection jvm


【解决方案1】:

首先检查你是否有:

StackOverFlowError 与堆栈有关:

由于应用程序递归太深而发生堆栈溢出时引发。

OutOfMemoryError 与堆有关:

当 Java 虚拟机由于内存不足而无法分配对象时引发,并且垃圾收集器无法提供更多内存。

如果你有一个 StackOverFlowError 可能你有一个与递归未完成有关的问题。所以检查你的退出条件以确保你有正确的退出条件。另一种可能性是让两个(或更多)方法相互调用。

如果你有一个 OutOfMemoryError,你可能在你的内存中存储了很多对象。例如,如果您将对象存储在 Map 中(例如将映射用作内存缓存系统)而不删除它们,就会发生这种情况。

【讨论】:

  • OutOfMemory:对象越大,发生的速度越快。曾经有过图像(真的是 large 的)这个问题。同事写了一个“图像缓存”,但是引用没有被清空,所以 GC 无法收集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多