是否可以从 gc 角度将 java 对象标记为不可收集以节省 gc 扫描时间?
类似的东西http://wwwasd.web.cern.ch/wwwasd/lhc++/Objectivity/V5.2/Java/guide/jgdStorage.fm.html特别是非垃圾收集容器那里(不可垃圾收集?)。
问题是我有很多普通的临时对象,但我有更大的(几个 Gigs)对象是为了缓存而存储的。 Java GC 没有理由遍历所有这些 Cache GB 来尝试查找任何要收集的内容,因为它们包含有自己的超时的缓存数据。
这样我就可以以自定义方式将数据划分为无限生命周期和正常生命周期的对象,并且希望 GC 会非常快,因为普通对象的生命周期不会那么长,并且数量较少。
有一些解决此问题的方法,例如Apache 直接内存和商业 Terracotta BigMemory(http://terracotta.org/products/bigmemory),但 java 原生解决方案会更好(我的意思是免费并且可能更可靠?)。另外我想避免序列化开销,这意味着它应该发生在同一个 jvm 中。据我了解主要是DirectMemory和BigMemory的操作off heap这意味着对象必须在 jvm 外部的内存中序列化/反序列化。简单地标记 jvm 内的非 gc 区域似乎是更好的解决方案。使用文件进行缓存也不是一种选择,它具有同样难以承受的序列化/反序列化开销 - 用例是一个 HA 服务器,其中大量数据以随机(人类)顺序使用,并且需要低延迟。
JVM 管理的任何内存也会被 JVM 进行垃圾收集。任何无需反序列化即可直接供 Java 方法使用的“活动”对象都必须位于 JVM 内存中。因此,根据我的理解,你不可能拥有不受垃圾收集影响的活动对象。
另一方面,您描述的用法应该使垃圾收集的分代方法非常有效。如果您的大对象停留一段时间,那么对它们进行回收检查的频率就会降低。因此,我怀疑避免这些检查是否能带来很多好处。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)