【业务功能篇 147】OOM场景示例、解决方案、ArrayList内存溢出、软引用

【业务功能篇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());

    }