JVM全称是Java Virtual Machine(java虚拟机),将JAVA字节码(class文件)转换为机器码的过程。
市面上的JVM包括Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Harmony、Google Dalvik VM、Microsoft JVM。
JVM在运行时将内存分为以下几个区域,分别是方法区,JAVA堆,JAVA栈,本地方法栈,程序计数器。
方法区存储已被虚拟机加载的类信息,常量,静态变量,以及编辑器编译后的代码等数据。
JAVA堆存放对象实例和数组。会有OutOfMemoryError)。
JAVA栈存放JAVA方法中的私有数据。
本地方法栈和JAVA栈类似,本地方法(native方法),也就是早期用C/C++实现的方法栈,加载本地方法库.
程序计数器是一个指针,记录指令执行的位置,需要空间很小,不会出现OutOfMemoryError。
其中,方法区和JAVA堆是线程共享的,JAVA栈和本地方法栈,程序计算器都是线程独享的。每一个新的线程,都会创建一个JAVA栈,本地方法栈和程序计数器。JAVA堆,JAVA栈和本地方法栈都会有OutOfMemoryError,JAVA栈和本地方法栈会有StackOverflowError。
JVM堆内存分为三个区域:Eden、From Survivor、To Survivor。
这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。
堆的内存模型大致为:
从图中可以看出: 堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。