概述
1.为什么要学习JVM
可以深入了解Java,分析字节码,得到准确的结论
可以提升排查问题的能力,可能出现内存溢出,GC频率导致响应慢等等
2.JVM的部分核心
2.1类装载子系统
类装载子系统主要功能是查找并验证类文件、完成相关内存空间的分配和对象赋值。
2.2运行时数据区
类文件加载到内存之后由运行时数据区来完成数据存储和数据交换。
运行时数据区又分为线程共享内存区和线程隔离内存区。
线程共享内存区包括方法区(存放类型信息、类型得常量池、域信息、方法信息、类变量、对类加载器的引用、对Class类的引用、方法表)和堆区(存储所有new出的对象、全局变量)
线程隔离内存区包括栈区(存储基本类的变量数据、对象的引用、局部变量)、程序计数器(存放下一指令所在单元地址)和本地方法栈(管理方法的调用),它们是完全由JVM来调度的内存区域
2.3执行引擎
JVM的执行引擎主要将字节码指令转换为机器指令,执行引擎主要包括解释器,即时编译器和垃圾回收器。
解释器:当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。
JIT编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。
程序计数器为什么要记录当前线程的执行地址?
因为CPU需要在不同线程之间来回切换,而线程是顺序执行的,记录执行地址(每个线程都有自己的程序计数器,并且是私有的)可以知道从哪里开始继续执行,另外JVM的字节码解释器需要通过改变PC寄存器的值来明确下一条字节码指令
3.JVM运行内存
- JVM运行内存:方法区(Method Area)、堆区(Heap)、Java 方法栈(Stack)、本地方法
栈、程序计数器 ( 寄存器 ) 。
- Java中每个线程有一个自己的虚拟机栈(Java方法栈),栈中元素为栈帧对象,栈帧包括操作数栈(用于执行运算,例如两个变量值的加减)、局部变量表(用于存储方法内的局部变量,对于实例方法,局部变量表的第 0 个位置为this)、方法返回值(记录调用方法的返回值) 、动态链接(方法中可以调用其它方法,如何找到要调用的方法?)、其它信息。
局部变量表:底层是数组,存储方法内的局部变量,main方法的args会存储在局部变量表下标为0的位置,对于实例变量下标为0处存储的是this。
操作数栈:用来进行运算。JVM的执行引擎会通过程序计数器中的指令地址,知道下一步该做什么。可以将指令对应的数据放入操作数栈,也可以讲操作数栈的数据取出存储到局部变量表,局部变量表里数据取出计算后,可以将计算结果存储到操作数栈。
JVM堆的构成:JVM堆主要用于存储Java对象,分为年轻代(Yong区)和老年代(old区),年轻代又分为伊甸园区和两个幸村区。
4.JVM垃圾回收
GC:垃圾回收,通过一定的算法堆内存中的垃圾对象进行回收内存,深入了解了解GC的工作机制可以避免内存泄漏,提高运行效率等。
判断对象是否为垃圾有两种:引用计数法(循环引用,对象无法回收,可能是弱引用、软引用(软引用,虚拟机在内存空间不足的时候,就会回收它,软引用,在内存块上没有强引用的时候,JVM执行回收的时候就会回收内存))和可达性分析法(从GC root引用对象,访问不到就认为不可达)
最后
以上就是开心柜子为你收集整理的浅析JVM虚拟机之一3.JVM运行内存4.JVM垃圾回收的全部内容,希望文章能够帮你解决浅析JVM虚拟机之一3.JVM运行内存4.JVM垃圾回收所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复