繁体   English   中英

Java垃圾收集器问题,短时间内会出现多个完整GC

[英]Java Garbage Collector Issues, Multiple Full GC in a short

当前,我们的服务器内存存在大量问题。 有时不到一个小时,它们就会耗尽内存。 我们有一台256gb服务器和hetzner的E5-1650 v3 Hexa-Core。 这是垃圾收集日志。 https://pastebin.com/7NUEGQs1 public void run(){}即使这个问题与内存泄漏和垃圾回收有关,它也使我在此处放置了代码

我不认为它会清除旧一代的任何对象,以及为什么当分配不足的情况下分配的内存从10gb下降到9.3gb为何如此。

我已经尝试了所有方法来解决此问题,甚至将服务器重置为出厂默认值,然后重新安装了所有内容。 我可能不知道这可能是内存泄漏。 即使是内存泄漏,这似乎也很奇怪。 它绝对不能这么快地运行那么多完整的gcs。

我们还注意到的另一件事是,当我们停止一台服务器时,其他三台服务器也开始崩溃。 这可能是一个内存问题,因为四个服务器中的每个服务器都分配了8-10 GB的内存。

这是否意味着不会删除任何旧的gen对象?

3978.597:[Full GC(人体工程学)[PSYoungGen:1165312K-> 647763K(2330112K)] [ParOldGen:6990613K-> 6990765K(6990848K)] 8155925K-> 7638529K(9320960K),[Metaspace:41441K-> 41441K(1087488K)], [3.7144066秒] [时间:用户= 34.89 sys = 0.09,实际= 3.71秒]

不管我的应用程序是什么,都必须从6gb的旧发电数据中清除150kb的错误,对吗?

ParOldGen:6990613K-> 6990765K(6990848K)

另一个答案是完全正确的,但没有反映您所说的一些不正确的假设:

当进行新的疏散处理时,将通过从根开始的引用来访问对象,以找出不可达的对象。

不,无法触及的人永远不会触及。 这是效率的关键,因为大多数新创建的对象在GC运行时都无法访问。 它仅处理可到达的对象,将它们复制到幸存者空间,剩下的就是可用内存。 GC不知道它留下了多少个无法到达的对象。 根本不在乎。

实际上,“垃圾收集器”应该被称为“非垃圾救援者”,因为它就是这样做的

结果,将考虑所有对象,包括在旧一代中分配的对象,如果它们可以访问,也将对其进行访问和标记。

不会。Eden和Survivor Spaces中无法到达的物体永远不会被碰到(*)。

正如Holger所说,只有在记住的集合中,老一代的对象才会被触摸。 这还包括旧一代中无法访问的对象,因为在次要GC期间,我们不知道哪些旧对象仍然可以访问(通常大多数对象都可以访问)。

据我了解,立即回收年轻一代和老一代是非常必要的,因为这些世代位于内存的不同连续部分。

不。主要的GC要求很高,因为老一代人很大。


(*)实现finalize或扩展Reference对象在无法访问时需要进行特殊处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM