文章插图
注:源代码就是.JAVA文件,JVM字节码就是.class文件
1. Java 堆(Java Heap):
(1)是Java虚拟机所管理的内存中最大的一块 。
(2)在虚拟机启动的时候创建 。堆是jvm所有线程共享的 。
(3)唯一目的就是存放对象实例,几乎所有的对象实例以及数组都要在这里分配内存 。
【Java虚拟机:Jvm概念和原理详解以及GC机制的分析】2. JVM栈(java虚拟机栈):
(1)每个线程创建的同时会创建一个JVM栈帧,JVM栈中每个栈帧存放的为当前线程中局部基本类型的变量.
3. 本地方法栈(Native Method Stack):
(1)jvm中的本地方法是指方法的修饰符是带有native的,但是方法体不是用java代码写的另一类方法 。
(2)作用同java虚拟机栈类似,区别是:虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务 。
(3)是线程私有的,它的生命周期与线程相同,每个线程都有一个 。
4. 方法区(Method Area):
(1)在虚拟机启动的时候创建 。所有jvm线程共享 。
(2)用于存放所有已被虚拟机加载的类信息、常量、静态变量、以及编译后的方法实现的二进制形式的机器指令集等数据 。
5. 程序计数器(Program Counter Register):
也叫PC寄存器,是一块较小的内存空间,它可以看做是当前线程所执行的字节码的第几行号指示器 。
在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成 。
文章插图
image
总结: 虚拟机栈、本地方法栈、程序计数器这三个模块是线程私有的,有多少线程就有多少个这三个模块,声明周期跟所属线程的声明周期一致 。以程序计数器为例,因为多线程是通过线程轮流切换和分配执行时间来实现,
所以当线程切回到正确执行位置,每个线程都有独立的程序技术器,各个线程之间的计数器互不影响,独立存储 。其余是跟JVM虚拟机的生命周期一致共享的 。
————————————————
6.类加载器子系统(class loader subsystem):
(1)根据给定的类名(如java.lang.Object)来装载class文件的内容到Runtimedataarea中的methodarea(方法区域) 。
(2)对(1)中的加载过程是:当一个classloader启动时,classloader的生存地点在jvm中的堆,然后它去主机硬盘上去装载A.class到jvm的methodarea(方法区)
7.执行引擎 :
(1)负责执行来自类加载器子系统(class loader subsystem)中被加载类中在方法区包含的指令集,通俗讲就是类加载器子系统把代码逻辑
(什么时候该if,相加,相减)都以指令的形式加载到了方法区,执行引擎就负责执行这些指令就行了 。
8.解释器:
一条一条地读取,解释并且执行字节码指令 。因为它一条一条地解释和执行指令,所以它可以很快地解释字节码,但是执行起来会比较慢 。这是解释执行的语言的一个缺点 。字节码这种“语言”基本来说是解释执行的 。
9.编译器:
(1. 即时编译器被引入用来弥补解释器的缺点 。执行引擎首先按照解释执行的方式来执行,然后在合适的时候,即时编译器把整段字节码编译成本地代码 。
(2. 然后,执行引擎就没有必要再去解释执行方法了,它可以直接通过本地代码去执行它 。执行本地代码比一条一条进行解释执行的速度快很多 。编译后的代码可以执行的很快,因为本地代码是保存在缓存里的 。
9.1. jdk,jre,JVM的关系:
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK) 。在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,
在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,而jvm和 lib合起来就称为jre 。
文章插图
10. 上图,堆内存分为三部分:
(1.新生区:是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命 。
(2.养老区:用于保存从新生区筛选出来的 JAVA 对象,一般池对象都在这个区域活跃 。
推荐阅读
- Java|聊聊写简历的那些坑,为什么你投出去的简历总是石沉大海!
- java 泛型详解
- 如果有人再问你 Java IO,把这篇文章砸他头上
- Java 界最好的 API 网关 Soul
- 使用 Java 持久化 API
- Jenkins安装并部署Java项目完整流程
- Java如何实现QQ第三方登录
- Java线程池原理解析
- 2020年的九大热门 Java 框架
- 你知道这高效的12个Java精品库嘛?