我的情况是有两个文件A和B,并且数据在两个文件中连续写入(如流)。
现在我知道文件A和B都将竞争内存,垃圾收集器将决定哪个页面将替换哪个文件。
我想通过使垃圾收集器支持文件A来控制垃圾收集(即垃圾收集器应该总是选择驱逐文件B的页面与A相比)。其他可能性是强制将文件B写入磁盘而不是在内存中缓存。
这些事情可以在java中发生吗?
答案 0 :(得分:1)
您无法强行要求Java进行垃圾回收。
但是你可以调用System.gc()
来请求JVM进行垃圾收集。
要确保对象已准备好进行垃圾回收,您可以将其分配给null
。这样,您可以确保在垃圾收集器运行时获取此对象并从堆中删除。
答案 1 :(得分:1)
我怀疑你将内存管理与垃圾收集混淆。是的,垃圾收集是内存管理的一种形式,但是在讨论“当内存空间不足时将哪些内存页面交换到磁盘”时,并不是你在谈论的内容。这不是垃圾收集,因为仍有活动引用A和B文件。在没有对象的引用之前,垃圾收集器不会执行任何操作。
您希望控制内存页面交换而不是垃圾回收。如果我对此错了,我肯定会在评论中予以纠正,但我不认为你可以用Java控制哪些内存页在可用内存不足时换成磁盘。
答案 2 :(得分:0)
Java具有自动垃圾收集功能,可以识别正在使用哪些对象,哪些对象正在使用,以及删除未使用的对象。
Java中垃圾收集的一个很好的来源是here
答案 3 :(得分:0)
您的问题的描述缺少某些细节,具体来说,是对文件的顺序写入还是涉及随机访问?
正如geneSummons正确指出的那样,JVM中的内存管理与操作系统的内存管理混淆。即使sun.misc.Unsafe也不允许您从Java应用程序控制操作系统级别的分页活动。
想要查看的内容是使用内存映射文件,但这取决于您是否对写入使用随机访问。如果你所做的只是按顺序写,这很可能没用。虽然这不能让您控制操作系统级别的文件分页,但它可以为您提供更有效的方法来解决您的问题。
有关此主题的有用文章https://howtodoinjava.com/java-7/nio/java-nio-2-0-memory-mapped-files-mappedbytebuffer-tutorial/