【业务功能篇136】MAT(Memory Analyzer Tool),找出导致OOM的代码-CSDN博客
Java内存溢出如何解决,Java oom排查方法,10个定位解决办法_javaoom怎么解决-CSDN博客
ArrayList内存溢出
Java内存溢出如何解决,Java oom排查方法,10个定位解决办法_javaoom怎么解决-CSDN博客ArrayList与LinkedList性能分析_new arraylist<>(linkedlist) 与.clone() 性能-CSDN博客
为什么我使用【ArrayList】存储数据报错【OOM】_"arraylist login=(arraylist)session.getattribute(\-CSDN博客
1.使用软引用
Java中四种引用详解以及对比区别_java四种引用的区别-CSDN博客
弱引用(WeakReference)在系统GC时都会进行回收,而软引用(SoftReference)是在内存不足时被回收,适用于实现缓存等功能。 我们可以把大对象LIst进行软引用
软引用( SoftReference) 会尽可能长的保留引用直到 JVM内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用
如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中
代码示例:
public static void main(String[] args) {
// 创建强引用对象
Object strongReference = new Object();
// 创建软引用
SoftReference<Object> softReference = new SoftReference<>(new Object());
// 创建弱引用
WeakReference<Object> weakReference = new WeakReference<>(new Object());
// 数组软引用
SoftReference<LinkedList<Integer>> arrayListSoftReference = new SoftReference<>(new LinkedList<>());
// 数组弱引用
WeakReference<LinkedList<Integer>> arrayListWeakReference = new WeakReference<>(new LinkedList<>());
AtomicInteger count1 = new AtomicInteger();
AtomicInteger count2 = new AtomicInteger();
for(int i = 0; i < 5; i++){
Optional.ofNullable(arrayListSoftReference.get()).ifPresent(e->e.add(count1.getAndIncrement()));
Optional.ofNullable(arrayListWeakReference.get()).ifPresent(e->e.add(count2.getAndIncrement()));
}
//注意这种写法,又有强引用了,需要注意,这样GC回收是回收不了的
// Optional<LinkedList<Integer>> weak = Optional.ofNullable(arrayListWeakReference.get());
// weak.ifPresent(e -> {
// e.add(1);
// e.add(2);
// e.add(3);
// });
//
// Optional<LinkedList<Integer>> soft = Optional.ofNullable(arrayListSoftReference.get());
// soft.ifPresent(e -> {
// e.add(1);
// e.add(2);
// e.add(3);
// });
// 强制垃圾回收
System.gc();
// 打印各种引用类型的对象,查看它们是否被回收
System.out.println("强引用: " + strongReference);
System.out.println("软引用: " + softReference.get());
System.out.println("弱引用: " + weakReference.get());
System.out.println("LinkedList软引用: " + arrayListSoftReference.get());
System.out.println("LinkedList弱引用: " + arrayListWeakReference.get());
}