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

本文介绍了如何使用MATMemoryAnalyzerTool排查Java中的OOM问题,重点讲解了软引用和弱引用的概念,以及它们在内存管理中的作用,提供了一个代码示例来展示如何在实际场景中使用这些引用类型来避免内存溢出。
摘要由CSDN通过智能技术生成

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

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值