java - 是否可以从 gc 的角度将 java 对象标记为不可回收以节省 gc-sweep 时间?

标签 java garbage-collection

是否可以从 gc 角度将 java 对象标记为不可回收以节省 gc-sweep 时间?

类似于 http://wwwasd.web.cern.ch/wwwasd/lhc++/Objectivity/V5.2/Java/guide/jgdStorage.fm.html 的内容特别是 non-garbage-collectible 容器 那里(non-garbage-collectable?)。

问题是我有很多普通的临时对象,但我有更大(几千兆)的对象存储用于缓存目的。 Java GC 无缘无故应该遍历所有这些缓存千兆字节以试图找到任何要收集的东西,因为它们包含有自己的超时的缓存数据。

这样我就可以以自定义方式将我的数据划分为无限生命和正常生命的对象,并且希望 GC 会非常快,因为正常对象的生命不会那么长并且数量更小。

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

最佳答案

JVM 管理的任何内存也由 JVM 进行垃圾回收。任何无需反序列化即可直接供 Java 方法使用的“Activity ”对象都必须存在于 JVM 内存中。因此,根据我的理解,您不能拥有不受垃圾收集影响的 Activity 对象。

另一方面,您描述的用法应该使垃圾收集的分代方法非常有效。如果你的大对象停留了一段时间,它们将不那么频繁地检查回收。因此,我怀疑避免这些检查是否会有很多好处。

关于java - 是否可以从 gc 的角度将 java 对象标记为不可回收以节省 gc-sweep 时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11332239/

相关文章:

Java:为每个扩展类创建一个抽象方法

java - AWS Redhat Chromedriver 不适用于 Java selenium

java - 如果有人将对象的引用作为接口(interface)持有,GC 会收集对象吗?

memory-leaks - w3wp.exe 垃圾堆充满了可用对象空间并不断增长

java - 如果有一个二级软引用对象,GC会做什么

java - 如何使用 Spring 缓存管理器与 redis 1.6.2.RELEASE

java - 将灰度值从 .csv 转换为 BufferedImage

memory - 如何让我的服务器(用 Golang 编写)不会耗尽内存?

c# - GC 收集...什么?

java - 无法在 Google App Emulator 中添加 google 帐户