是否可以从gc透视图标记不可收集的java对象以节省gc-sweep时间?

Mar*_*tin 9 java garbage-collection

是否可以从gc透视图标记不可收集的java对象以节省gc-sweep时间?

有关http://wwwasd.web.cern.ch/wwwasd/lhc++/Objectivity/V5.2/Java/guide/jgdStorage.fm.html的内容,特别是非垃圾收集容器(非垃圾 -收藏?).

问题是我有很多普通的临时对象,但我有更大的(几个Gigs)对象存储用于缓存目的.Java GC无缘无故地遍历所有那些试图找到要收集的内容的Cache千兆字节,因为它们包含具有自己超时的缓存数据.

通过这种方式,我可以将自定义方式的数据划分为无限期和正常生存的对象,并且希望GC非常快,因为普通对象不能存活这么长时间并且数量较少.

这个问题有一些解决方法,例如Apache DirectMemory和Commercial Terracotta BigMemory(http://terracotta.org/products/bigmemory),但java-native解决方案会更好(我的意思是免费且可能更可靠?).此外,我想避免序列化开销,这意味着它应该在相同的jvm内发生.据我所知,DirectMemory和BigMemory主要在堆上运行,这意味着必须将对象序列化/反序列化到jvm外部的内存中.简单地在jvm中标记非gc区域似乎是更好的解决方案.使用文件进行缓存也不是一种选择,它具有相同的无法承受的序列化/反序列化开销 - 用例是一个HA服务器,其中包含大量以随机(人工)顺序使用的数据,并且需要低延迟.

Ste*_*n C 1

是否可以从 gc 角度将 java 对象标记为不可收集以节省 gc 扫描时间?

不,这是不可能的。

您可以通过保持对象可访问来防止对象被垃圾收集,但 GC 仍然需要跟踪它们以检查每个完整对象的可访问性;GC(至少)。

这只是我的假设,当 jvm 饥饿时,它也开始扫描所有那些不必要的对象。

是的。那是对的。但是,除非您有很多想要以这种方式处理的对象,否则开销可能微不足道。(无论如何,更好的想法是给 JVM 更多内存……如果可能的话。)