死循环while/for中new对象? 不怕 OOM 吗?

一、前言

今天遇到一个又去的问题,在死循环中new对象,会造成 OOM 吗

把这问题发到技术群中,有说会,有说不会的,引起一片热论。

我们还是来个demo模拟一下,看看什么结果吧

 

二、模拟在死循环中new对象

代码如下:

    public static void main(String[] args) { 
        while (true) {
            try {
                log.info("new");
                //模拟new对象,加入10000条数据
                Map<String,Integer> map =new HashMap<>();
                for (int i = 0; i< 10000; i++){
                    map.put(""+i,i);
                }
            } catch (Exception e) {
                log.error("exception!", e);
            } finally {
                try {
                    //等待2秒
                    TimeUnit.SECONDS.sleep(2);
                } catch (Exception e) {
                    log.error("sleep exception!", e);
                }
            }
        }
    }

 然后配合JDK的  Java VisuaLVM  工具检查堆空间的内存,找到 jdk的bin目录下 jvisualvm.exe 文件,双击打开即可。

打开之后,界面如下:

 然后运行我们的demo之后这边的列表就会出现个代码执行的package,双击 ==> 监控 ==> 即可查看我们代码执行后JVM中堆空间的内存变化。

 三、结论

 

 等执行一段时间之后,根据上图可以发现堆空间中的内存到了一定值之后就会被GC回收,由此得到结论:

死循环中new对象,不会OOM,原因是每一轮循环之后对象就失去了引用,等到GC执行,对象就会被回收;

但是,如果我们的对象内存很大(例如:刚才的Map中put很多很多值进去),已经超过JVM的堆空间,就会OOM。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
面向对象(Object-oriented,简称OO)是一种计算机编程思想和方法,它将现实世界的事物抽象为一个个对象,通过对象之间的交互和协作来完成任务。面向对象编程(OOP)是一种基于面向对象思想的编程方法,它以类和对象为基本组织单位,通过封装、继承和多态等特性,实现代码的复用性、可读性、可维护性和可扩展性。 OOM的特点包括: 1. 封装性:将数据和方法封装在类内部,对外部隐藏内部细节,使得使用者无需知道实现细节,只需要通过类提供的接口来访问对象。 2. 继承性:通过继承可以实现代码的复用,子类可以继承父类的属性和方法,并可以扩展或重写父类的功能。 3. 多态性:同一种类型的对象,在不同的情况下可以表现出不同的行为,提高代码的灵活性和可扩展性。 4. 抽象性:抽象是指将具有相似特征和行为的事物抽象为一个类,通过类的实例化来实现具体的功能。 使用OOM开发软件的好处包括: 1. 代码的复用性高,可以减少代码量,提高开发效率。 2. 可读性和可维护性好,代码结构清晰,易于维护和修改。 3. 可扩展性强,可以方便地增加新的功能和模块。 4. 可靠性高,通过封装和多态等特性,可以提高代码的健壮性和可靠性。 总之,OOM是一种现代化的编程方法,它能够帮助开发者更好地完成软件开发任务,提高软件的质量和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值