一、 执行引擎
前端编译(.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 =