我很好奇在Java中是否有任何方法可以根据需要释放内存 - 就像iOS中的UIApplicationDidReceiveMemoryWarningNotification
一样?
例如,我的程序中可能有一个用作缓存结构的数组,当JVM有内存压力(堆空间耗尽)时,我可以通过强制GC和清理数组来获取一些通知来释放一些内存缓存?
如果您认为问题不明确,请发表评论〜
答案 0 :(得分:3)
GC会在需要时自动运行,因此您无需收到通知。
对于要在内存不足时手动删除条目的缓存,可以使用SoftReference
s。如果只保留对缓存条目的软引用,则垃圾收集器将在需要更多内存时自动从缓存中删除条目。
已经有很多现有的缓存实现可以为您处理这个问题(这一点并不容易),例如在Guava库中(参见CacheBuilder
)。
答案 1 :(得分:2)
在Java中,您通常应该让GC为您处理内存。
如果你想要一个在有内存压力时会被清除的缓存,那么你应该使用一个基于 Soft References 的缓存(这是Weak References更常规类别的变体)。如果一个对象仅由软引用引用,那么GC将在内存不足之前将其清除。
创建软参考缓存的一种简单方法是使用Guava的CacheBuilder。
答案 2 :(得分:1)
除了已经提到的SoftReference之外,您只需注册一个触发的通知即可。内存使用率约为95%:
MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
NotificationBroadcaster emitter = (NotificationBroadcaster) mbean;
emitter.addNotificationListener(new NotificationListener() {
public void handleNotification(Notification notification, Object handback) {
System.out.println("Low memory notification");
}
}, null, null);
for (MemoryPoolMXBean memPool : ManagementFactory.getMemoryPoolMXBeans()) {
if (memPool.isUsageThresholdSupported()) {
MemoryUsage memUsage = memPool.getUsage();
memPool.setUsageThreshold((long) (memUsage.getMax() * 0.95));
}
}
答案 3 :(得分:0)
Java VM自行管理内存。
您所能做的就是对缓存对象进行空引用并调用
System.gc()