最近写者开始学习JVM,如果你和我一样是初学者,希望这篇文章能够帮助到你!
个人认为这块还是非常有必要去认真了解及学习的,特别是刚入门或入门不久的java开发来说,这是java的基石。
JVM解释
JVM全称为
Java Virtual MAchine
-Java虚拟机,我们可以直观的从名字上得出一个定义:JVM是java上的一个虚构出来的计算机,是一个位于Java与操作系统之间的中间态。有自己完善的硬件结构,如处理器、堆栈、寄存器等,还具有相应的指令系统。
JVM作用
Java程序的跨平台特性主要就是因为JVM实现的。在编译java程序时会将写好的源程序通过编译器编译生成.class文件(又称为字节码文件),之后就是通过JVM内部的解释器将字节码文件解释成为具体平台上的机器指令执行,所以就可以实现java程序的跨平台特性。
JVM内部体系结构大致分为三部分:类装载器(ClassLoader)
子系统,运行时数据区
和执行引擎
。
java程序运行与JVM的关系:
1.java源文件编译生成.class文件(字节码)
2.字节码由JVM解释运行。
因为java程序既要编译同时也要经过JVM的解释运行,所以java被称为半解释语言。
JVM位置
初学JVM,是不是有这样的疑惑,JVM在哪?
对于JVM的位置:JVM是运行在操作系统之上的,它与硬件没有直接的交互
JVM体系结构
方法区
方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是 实例变量存在堆内存中,和方法区无关
JNI (Java 本地方法接口)
** 即:Java Native Interface,凡是带了Native关键字的方法就会进入本地方法栈,其他的就是Java栈**
Native Method Stack
它的具体做法是Native Method Stack 中登记native方法,在(Execution Engine)执行引擎执行的时候加载Native Libraies。【本地库】
栈
栈:栈内存,主管程序的运行,生命周期和线程同步;
线程结束,栈内存也就释放,对于栈来说,不存在垃圾回收问题
一旦线程结束,栈就Over!
栈运行原理:栈帧
,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。
堆
Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。
类加载器读取了类文件后,一般会把 类、方法、常量、变量~ 放在堆中,来保存我们的所有引用类型的真实对象。
堆内存中还要细分为三个区域:
- 新生区 (伊甸园区)Young/New
- 养老区 Old
- 永久区 Perm
GC垃圾回收,只要在伊甸园区和养老区
~
假设内存满了,OOM(OutOfMemory:堆内存不够)
在JDK8以后,永久存储区改了名字(元空间
)
PC寄存器(即:程序计数器)
每个线程都有一个线程计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向像一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常下的内存空间,几乎可以忽略不计