JVM:通过软件模拟的一个完整的具有硬件系统功能的计算机系统,运行在一个完全隔离的环境中。具有跨平台的功能。
jvm和vmware 的区别:vmware模拟的是真实存在的计算机系统。但是jvm模拟的是一个虚拟不存在的系统
jvm如何实行跨平台?
原理:编译后字节码文件和平台无关,所以只需要每个平台有对应的虚拟机就可以。
jVM ,jdk, jre 三者
java语言优点:
优点:摆脱平台的束缚,有了jvm就可以实现跨平台,一次编写,到处运行。它提供了一个相对安全的内存管理和访问机制,避免了大部分的内存泄露,和指针越界问题。
JDK:把java程序设计语言,java虚拟机,java api类库这三部分统称为JDK。JDK是用于支持java程序开发的最小环境。
JRE: java api类库中的javase api子集和java虚拟机称为 JRE; JRE是支持java程序运行的标准环境
jvm各个区域:
程序计数器:
程序计数器,可以看作是当前线程执行字节码文件的一个行号指示器。字节码解释器,通过程序计数器的值来选取下一条需要执行的指令是什么。分支,循环,跳转,异常处理,线程恢复都是由它来实现。如果执行的是一个本地方法,那么计数器值为空。
每个线程都有私有的程序计数器。它的生命周期随线程的启动而产生,随线程结束而消亡。它是唯一一个没有规定outofMemoryError异常的区域,不存在内存溢出。
java虚拟机栈:
也是线程私有的,生命周期和线程同步。虚拟机栈描述的是java方法执行的内存模型。并且每一个方法执行的同时都会创建一个栈帧存入虚拟机栈,方法执行完毕,对应的栈帧就会出栈。
(栈帧:是方法运行是的基本数据结构。包含了方法的局部变量表,操作数栈,返回地址,动态连接等信息)
对于这个区域,有两种异常状况: 1、如果线程请求栈帧的深度大于虚拟机栈的深度,那就会抛出StackOverflowError异常,如果虚拟机栈可以进行动态扩展,但是扩展时无法申请足够的内存,就会抛出OutOfMemeoryError异常。
本地方法栈:
和虚拟机栈它们非常相似,不同在于虚拟机栈用于java方法的调用,而本地方法栈用于本地方法的调用。有的虚拟机直接就把虚拟机栈和本地方法栈合二为一。和虚拟机栈一样。本地方法栈也会抛出StackOverflowError异常和OutOfMemeoryError异常。
( native方法:被native修饰的方法,主要用于加载文件,和动态连接库。它和抽象方法相似,只有方法签名,没有方法体。本地方法无法实行跨平台,它可以被c语言重写。)
java堆:
是虚拟机所管理内存中最大的一块,几乎所有的对象实例都在这里分配。它在虚拟机启动是就创建了,是被所有线程共享的一块区域。java堆也是垃圾回收管理的主要区域,也就是“GC"堆。从内存分配角度来说,java堆还可以细分成多个线程私有的分配缓存区,进一步细分可以方便更好的进行回收,更快的进行分配内存。其实无论如何划分,都和存放内容无关,都存的是对象实例。
java堆也是可以进行动态扩展的,如果对象没有内存去完成实例分配,并且堆也没法再扩展,就会抛出OutOfMemoryError异常。
方法区:
也是线程共享的区域,用于存储常量,类变量,类信息等数据。
如果方法区内存不足,会抛出OutOfMemoryError异常
运行时常量池:
是方法区的一部分。用于存放编译时期的字面量和符号引用。这部分内容在类加载后进入方法区的运行时常量池。如果常量池在方法区无法申请到内存空间,会抛出OutOfMemoryError异常。
直接内存:
本机内存,在java堆外。它并不是运行时数据区的一部分,它不用java堆的内存限制,它是直接本机系统申请内存,受本机总内存的限制。