javad的虚拟机知识的学习参考了周志明的《深入理解java虚拟机》。

Java虚拟机时java的核心。下图是虚拟机的轮廓图,也就是JRE的架构。

怎么画框框java java框图_怎么画框框java

在上图中可以看到红框内的是JVM的内存分配图。当然虚拟机的使用内存并不只是这些内存空间,直接内存是java程序可以使用的外内存。在java中,像这种内存只有NIO这种大IO的工具使用。

如图红框内的内存分配图,JVM的内存共有5个区域:程序计数器、虚拟机栈、本地方法栈、方法区、堆。

程序计数器:在解析字节码文件时,总是指向下一条需要执行的字节码指令的地址。

虚拟机栈:存储者调用时程序的信息,即栈帧。

本地方法栈:此内存和虚拟机栈的功能相同,只是存储的信息对象是本地方法。

方法区:存储经过编译器编译之后的代码和运行时常量池。

堆:为程序运行时动态的分配内存和销毁内存,同时也是程序GC的对象。

以上五个内存区域是Java进程私有的,即只要运行Java程序,即可分配。

但是当一个进程中有多个线程执行时,则虚拟机栈,本地方法栈和程序计数器则是线程私有的。而堆和方法区的数据是线程共享的。

内存分配讲完了,下面讲讲垃圾回收机制。

在讲来回收机制之前,事先说明垃圾回收针对的对象是堆和方法区。

首先,要进行垃圾回收需要设置确定垃圾内存的机制。

在虚拟机中,使用程序计数和可达性分析确定内存中的对象是否为一个垃圾对象(在现在到程序执行完成都不会被使用的内存对象)

其次,回收已经确定的垃圾内存。

在回收垃圾内存的策略有:标记-清除、复制、标记-整理和分代收集

最后,将垃圾回收按照不同的场景需求,使用不同的确定垃圾和回收垃圾策略的组合,设计出垃圾收集器。

在垃圾收集时,使用了分代收集垃圾的回收策略。

在JVM中虚拟机的总体框架时分代收集策略,将内存中的数据分为新生代(在内存中初始分配的对象存储区域)和老年代(经过GC之后依然驻留在内存中的对象存储区域)。

在新生代使用的垃圾收集器有Serial,ParNew和ParallelScavenge。

在老年代使用的垃圾收集器有Serial Old,Parallel Old和CMS收集器。

而G1则是非常强大的垃圾回收器,是1.7版本以上常用的垃圾回收器,并且兼顾了老年代和新生代的垃圾回收工作。