jvm---执行引擎、垃圾回收

本文介绍了JVM执行引擎的设计,包括解释器和JIT编译器的作用,探讨了为何采用半解释型半编译型设计。接着详细讲解了垃圾回收的原理,包括垃圾的定义、GC的重要性、早期GC历史、当前的垃圾回收机制,特别是堆内存的回收。此外,还讨论了内存溢出和内存泄漏的区别,并概述了垃圾收集算法,如引用计数和可达性分析。文章还涉及了System.gc()的理解、STW现象以及对象引用的类型。最后,简述了垃圾回收器的分类和性能指标,特别提到了CMS并发垃圾回收器的特点。
摘要由CSDN通过智能技术生成

一、 执行引擎

前端编译(.java --> .class)字节码 不等于 机器码,需要jvm将字节码加载到内存中,需要通过执行引擎将字节码 解释/编译成机器码 后端编译(.class --> 机器码)。

执行引擎机制:

  • 解释器 :将字节码逐行解释执行
  • JIT编译器(即时编译器):将字节码整体编译为机器码执行

1、为什么JVM执行引擎设计为半解释型,半编译型?

逐行解释执行效率低
JVM会针对使用效率较高的热点代码进行编译,并缓存起来,执行效率提高
但是编译是需要消耗时间的。
所以jvm刚刚启动后,可以先通过解释器,解释执行代码
之后在使用编译器编译执行,两种结合在一起

二、垃圾回收

在这里插入图片描述

1、概述

垃圾收集机制并不是java语言创的,但是又是java的招牌,java可以自动垃圾回收

2、垃圾回收:

回收哪些区域:频繁回收内存,较少回收方法区,栈(溢出),本地方法栈(溢出),程序计数器没有垃圾回收。

3、什么是垃圾?

    while (true){
   
            new Random().nextInt();
        }

垃圾是指在运行程序中没有任何引用指向的对象,这个对象就是需要被回收的垃圾。

4、为什么需要GC?

(1)垃圾如果不及时清理,越积越多,可能会导致内存溢出。
(2)垃圾多了,内存碎片较多,例如数组,需要连续空间
(3)随着应用程序应付的业务越来越大,没有GC就不能保证应用程序的正常进行。

5、早期垃圾回收

早期是手动回收不被使用的对象,例如C++,java语言是自动垃圾收集的。

6、垃圾回收机制

自动内存管理:无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险。以更专心地专注于业务开发
自动收集的担忧:自动回收方便了程序员的开发,但是降低处理内存问题的能力。
自动虽好,但是还是应该了解并掌握一些相关内存管理知识。

7、 Java 堆是垃圾收集器的工作重点

从次数上讲:
频繁收集 Young 区
较少收集 Old 区
基本不收集元空间(方法区

三、内存溢出与内存泄漏

溢出:内存不够用了
泄漏:有些对象已经在程序不被使用了,但是垃圾回收机制并不能判定其为垃圾对象,不能将其回收掉,这样的对象越积越多,长久也会导致内存不够用。

eg:
与数据库连接完之后,需要关闭连接通道,但是没有关闭。
io读写完成后没有关闭

四、垃圾收集算法分为两大类

1、垃圾标记阶段算法

主要是来判定哪些对象已经不再被使用,标记为垃圾对象,
判定对象为垃圾的标准:不被任何引用所指向的对象。Object obj =new Object();

1、引用计数算法(在jvm中不被使用)

如果有一个引用指向此对象,那么计数器加1,如果没有引用指向,计数器为0,此时就判定位垃圾。

优点:方便使用,设计简洁
缺点:增加了计数器的存储空间,计数需要消耗时间。

  • 导致了循环引用问题,好几个对象之间相互引用,但是没有其他引用指向他们,此时垃圾回收不能回收他们,但是也没有引用指向,这就造成了内存泄漏。
Object obj = new Object();
		obj =
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值