JDK,JRE,JVM概念理解
安装jdk,还会默认安装JRE
JDK的编译器Javac[.exe],会将Java代码编译成字节码(.class文件)。编译出的字节码在任何平台上都一样的内容,所以我们说Java语言是门跨平台语言。
JRE ,它为Java提供了运行环境,其中重要的一环就是通过JVM将字节码解释成可执行的机器码。
在运行时环境,JVM会将Java字节码解释成机器码。机器码和平台相关的(不同硬件环境、不同操作系统,产生的机器码不同),所以JVM在不同平台有不同的实现。
总结:jdk将 java代码编译成字节码(.class文件),JVM会将Java字节码解释成机器码
Java虚拟机原理
1、什么是java虚拟机,以及java虚拟机的作用
Java虚拟机--jvm:java virtual machine
java虚拟机跟java一点关系都没有,只不过java是在虚拟机上运行而已。更准确的说任何语言只要编译成.class文件都能在虚拟机上运行。所以, java跨平台的原因就是因为有Java虚拟机。
我们知道执行的命令是java ,这是java一个包装好的命令,这个命令执行了就是启动一个jvm虚拟机。然而启动虚拟机是不够的。因为jvm不知道我该运行什么。所以要有一个系统来把本地的.class里面的2进制文件加载进虚拟机中。把文件加载进来我需要开辟一个地方来存放这些东西吧。把东西存放了之后jvm需要知道 你到底让我干什么啊。这时候就需要解析文件,既然虚拟机可以使用了,那么按照程序所写的执行完了。东西岂不是还存在‘一个地方‘中,那么长久下来机器还不撑爆了,所以需要定时吧不用的都删除,以保证内存。通俗来讲这就是虚拟机做的事情。
‘加载进虚拟机’- – 类加载器子系统
’一个地方‘ --- 运行时数据区域(堆 栈)
’解析文件‘--- 执行引擎子系统
’定时删除‘--- 垃圾收集子系统
以上就是jvm的基本东西,他们算在一起才叫jvm。

2、jvm内存模型:JVM内存空间管理

大体分:jvm分为堆和堆外
详细分:方法区,堆,本地方法栈,运行时数据区,程序计数器
(1)、方法区:方法区存放了要加载的类的信息(如类名,修饰符)、类中的静态变量、final定义的常量、类中的field、方法信息,当开发人员调用类对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区。方法区是全局共享的,在一定条件下它也会被GC。当方法区使用的内存超过它允许的大小时,就会抛出OutOfMemory:PermGen Space异常。
在Hotspot虚拟机中,这块区域对应的是Permanent Generation(持久代),一般的,方法区上执行的垃圾收集是很少的,因此方法区又被称为持久代的原因之一,但这也不代表着在方法区上完全没有垃圾收集,其上的垃圾收集主要是针对常量池的内存回收和对已加载类的卸载。在方法区上进行垃圾收集,条件苛刻而且相当困难。
(2)、本地方法栈:本地方法栈用于支持native方法的执行,native修饰的方法和平台有关,可移植性不高,可以被c语言重写。
(3)、程序计数器:程序计数器是一个比较小的内存区域,可能是CPU寄存器或者操作系统内存,其主要用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前线程的行号指示器。字节码解释器在工作时,会通过改变这个计数器的值来取下一条语句指令。 每个程序计数器只用来记录一个线程的行号,所以它是线程私有(一个线程就有一个程序计数器)的。
如果程序执行的是一个Java方法,则计数器记录的是正在执行的虚拟机字节码指令地址;如果正在执行的是一个本地(native,由C语言编写完成)方法,则计数器的值为Undefined,由于程序计数器只是记录当前指令地址,所以不存在内存溢出的情况,因此,程序计数器也是所有JVM内存区域中唯一一个没有定义OutOfMemoryError的区域。
(4)、虚拟机栈:占用的是操作系统内存,每个线程都对应着一个虚拟机栈,它是线程私有的,而且分配非常高效。虚拟机栈中定义了两种异常,如果线程调用的栈深度大于虚拟机允许的最大深度,则抛出StatckOverFlowError(栈溢出);不过多数Java虚拟机都允许动态扩展虚拟机栈的大小(有少部分是固定长度的),所以线程可以一直申请栈,直到内存不足,此时,会抛出OutOfMemoryError(内存溢出)。
(5)、堆(重点):Java虚拟机分代收集(后续更新)

浙公网安备 33010602011771号