【问题标题】:How to do user control cache eviction/ garbage collection in java?java - 如何在java中进行用户控制缓存驱逐/垃圾回收?
【发布时间】:2017-09-06 21:50:57
【问题描述】:

我有一个情况,有 2 个文件 A 和 B,并且数据都被连续写入它们(如流)。

现在我知道文件 A 和 B 都将争夺内存,垃圾收集器将决定替换哪个文件的哪个页面。

我想通过让垃圾收集器偏爱文件 A 来控制垃圾收集(即,与文件 A 相比,垃圾收集器应该始终选择驱逐文件 B 的页面)。其他可能性是强制将文件 B 写入磁盘而不是缓存在内存中。

这些事情在java中会发生吗?

【问题讨论】:

    标签: java caching garbage-collection


    【解决方案1】:

    我怀疑您将内存管理与垃圾收集混淆了。是的,垃圾收集是内存管理的一种形式,但在讨论“当内存空间不足时,哪些内存页面将被换出到磁盘”时,这不是您所说的。这不是垃圾收集,因为仍然存在对A 和 B 文件。在没有对象引用之前,垃圾收集器不会做任何事情。

    您想控制内存页面交换而不是垃圾收集。如果我对此有误,我相信我会在 cmets 中得到纠正,但我认为您无法在 Java 中控制在可用内存不足时将哪些内存页面交换到磁盘。

    【讨论】:

      【解决方案2】:

      您不能强行要求 Java 进行垃圾回收。

      但您可以调用System.gc() 请求JVM 进行垃圾回收。

      要确保对象已准备好进行垃圾回收,您可以将其分配给null。这样你就可以确保当垃圾收集器运行时它会得到这个对象并从堆中删除。

      【讨论】:

        【解决方案3】:

        Java 具有自动垃圾回收功能,可识别哪些对象正在使用,哪些未使用,并删除未使用的对象。

        关于 Java 中的垃圾回收的一个很好的来源是 here

        【讨论】:

          【解决方案4】:

          您的问题描述缺少某些细节,具体来说,是对您的文件的写入是顺序的还是涉及随机访问?

          正如geneSummons 正确指出的那样,JVM 中的内存管理与操作系统中的内存管理相混淆。即使 sun.misc.Unsafe 也不允许您从 Java 应用程序控制操作系统级别的分页活动。

          可能想要查看的是使用内存映射文件,但这确实取决于您是否使用随机访问进行写入。如果您所做的只是按顺序编写,那么这很可能是没有用的。虽然这不能让您在操作系统级别控制文件的分页,但它可以为您提供解决问题的更有效方法。

          有一篇关于这个主题的有用文章,https://howtodoinjava.com/java-7/nio/java-nio-2-0-memory-mapped-files-mappedbytebuffer-tutorial/

          【讨论】:

            猜你喜欢
            • 2014-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-07
            • 2011-06-25
            • 2016-01-20
            • 1970-01-01
            相关资源
            最近更新 更多