我有一个JavaSpringBoot项目。当执行与多线程(executor服务)相关的代码时,内存将被填满。gc没有清除此内存。在阅读了gc文档之后,我才知道永久内存没有被清除。通过使用java profiler监视jvm,我注意到这个终身生成永远不会被清除(对于我来说,直到完全)。我怎样才能把终身监禁的空间弄清楚?我们正在使用docker映像运行应用程序
3z6pesqy1#
这里有两个潜在的问题。垃圾收集器只能释放无法访问的对象。因此,如果终身物体仍然可以到达,它们就永远不会被释放。这是一个内存泄漏场景。jvm可能没有运行旧的/永久的空间集合,因为它不需要运行。jvm通常只在认为有必要/经济的情况下运行旧的空间收集器。这实际上是一件好事,因为大多数容易(便宜)收集的垃圾通常都在新的空间里。在阅读了gc文档之后,我才知道永久内存没有被清除。那可能是对文件的误读。gc将在终身空间收集物体。它应该在你开始分泌分泌物之前发生。我怎样才能让总承包商清理终身空间?你可以打电话 System.gc() ... 这给jvm一个提示,现在运行gc是件好事。然而:这只是一个暗示。jvm可能会忽略它。它可能运行也可能不运行旧的空间集合。它不会“清除”老一代。它甚至不一定会释放所有无法访问的对象。打电话通常效率不高 System.gc() . jvm通常对运行gc的最有效时间以及运行哪种gc有更好的了解。运行gc实际上可能不会释放内存供系统的其余部分使用。简而言之,打电话可能是个坏主意 System.gc() . 在大多数情况下,它什么也做不到。如果你真正的问题是内存泄漏的话,它肯定会有帮助。如果你得了oome病,那就没用了。
System.gc()
1条答案
按热度按时间3z6pesqy1#
这里有两个潜在的问题。
垃圾收集器只能释放无法访问的对象。因此,如果终身物体仍然可以到达,它们就永远不会被释放。这是一个内存泄漏场景。
jvm可能没有运行旧的/永久的空间集合,因为它不需要运行。jvm通常只在认为有必要/经济的情况下运行旧的空间收集器。这实际上是一件好事,因为大多数容易(便宜)收集的垃圾通常都在新的空间里。
在阅读了gc文档之后,我才知道永久内存没有被清除。
那可能是对文件的误读。gc将在终身空间收集物体。它应该在你开始分泌分泌物之前发生。
我怎样才能让总承包商清理终身空间?
你可以打电话
System.gc()
... 这给jvm一个提示,现在运行gc是件好事。然而:这只是一个暗示。jvm可能会忽略它。
它可能运行也可能不运行旧的空间集合。
它不会“清除”老一代。它甚至不一定会释放所有无法访问的对象。
打电话通常效率不高
System.gc()
. jvm通常对运行gc的最有效时间以及运行哪种gc有更好的了解。运行gc实际上可能不会释放内存供系统的其余部分使用。
简而言之,打电话可能是个坏主意
System.gc()
. 在大多数情况下,它什么也做不到。如果你真正的问题是内存泄漏的话,它肯定会有帮助。如果你得了oome病,那就没用了。