今日学习软引用时,按照示例编写的代码测试软引用在JVM内存不足时回收,遇到问题,请大神指点
测试的代码如下
public class T02_SoftReference {
public static void main(String[] args) {
SoftReference<byte[]> m = new SoftReference<>(new byte[1024 * 1024 * 10]);
// m = null;
System.out.println(m.get());
System.gc();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(m.get());
// 再分配一个数组,heap将装不下,这个时候系统会垃圾回收,先回收一次,如果不够,会把软引用回收
byte[] b = new byte[1024 * 1024 * 15];
System.out.println(m.get());
}
}
idea配置此run的参数
运行时报错
按计划应该第三次m.get()应该是null,求指点
我把大小调整到 25 到时候就出现预期的情况了
你这个换成弱引用差不多能行,你这没内存泄露,就是单纯的OOM,我的理解是软引用JVM还是倾向于保留的
垃圾回收不要手动调用,垃圾回收调用了不一定会执行,只有内存不足时候才执行,否则只是尽量执行,jvm是会自动优化的
你这个设置堆内存太小,你一个
new byte[1024 * 1024 * 15]就把内存撑爆了,你直接把堆内存设置为30m,吧手动那行system.gc去掉,另外在启动参数加上-XX:+PrintGCDetails就能看到效果了。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632