谈谈我对JVM的理解
声明:文章只代表个人理解,有误请联系改正,谢谢;
JVM可以拆成J 、VM来方便理解,J代表JAVA ; VM就是虚拟机(大家应该接触过),JVM可以理解成Java的虚拟机,其中JVM是JRE的一部分
上述解释只是方便理解,JVM只是对应硬件设备的简单封装,和VMware虚拟机不是一回事,也不要混淆了
JVM包含了字节码的指令集、寄存器、栈和堆(垃圾回收堆),存储的方法域;
为什么要使用JVM,或者说JVM的诞生的一部分原因是因为java本身是开放的,可跨平台的,而使用JVM就是为了实现跨平台;
java虚拟机内存发模型包括计数器、虚拟机栈、本地方法栈、方法区、堆;
程序计数器:
需要注意他的线程特点,各线程相互独立互不影响;(在执行native方法,这时计数器为null;)
其中程序计数器也是JVM规范中唯一没有规定任何OutOfMemoryError异常情况的区域;
虚拟机栈和本地方法栈
这里的虚拟机栈和本地方法栈,与我们平常所说的栈可以视为一种东西,存储的就是:1.局部变量表、2.操作数栈、3.动态链接、4.方法出口
(具体想了解栈,可以去这里理解:https://blog.csdn.net/lml6862/article/details/129220622)
可以这样理解区别:虚拟机栈是给JVM使用的,而本地方法栈是给本地方法使用的;
方法区:
方法区是用于存储被虚拟机加载的类信息、常量、静态变量;方法区也可以称为持久代(Permanent Generation)主要存放就是java类定义信息;
堆:
可以说是JVM较大的一块区域了,此位置通常都是存放对象实例,所以对象实例也是在此分配;
新生代:包括了eden区、From Survivor区、Survior区
老年代:一般存放的都是生命周期较长的对象,也有经历了多次垃圾回收后仍然存在的对象,也会被放入老年代;
垃圾回收CG:
就两方面:确定垃圾以及回收垃圾
Java判断一个对象是否是垃圾,使用的有两种方法:引用计数法(reference-counting)和可达性分析法(GC Roots Tracing)
1.引用计数法:每一个对象都有一个引用计数器,当这个对象被引用了一次以后,这个计数器就会 +1,当取消这个对象的一次引用以后,这个计数器就会 -1,当引用计数器的值为0 的时候,就代表这个对象失去了价值,就可以被判断是垃圾,就可以被CG垃圾回收机制处理。
2.可达性分析法:也是目前主流虚拟机使用的算法;本人不太理解,后续理解后在补充。
相关的算法有:
1.标记清除算法:首先标记需要处理的对象,然后统一回收,缺点:效率低
2.复制算法:划分一份内存区域,将这区域等分的一分为二,然后分别进行使用,一个用完后,再用另一个(上一区域用完的且还存活的对象会被复制到这个区域),然后清理之前的区域。缺点:内存较小,利用率低
3.标记整理算法:将存活的对象移向另一端(区域),然后清理掉边(区域)以外的;
4.分代收集算法:是目前最常见和普遍用的算法,即新生代采用复制算法,老年代采用标记整理算法;
-------------------------------------------
个性签名:选择比努力更重要
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

浙公网安备 33010602011771号