Java虚拟机--一段Java程序的生命史(三)

  • 来源:
  • 更新日期:2018-05-23

摘要:以上就是整个编译的过程了小编接下来介绍类加载:编译将程序编译成字节码之后下一步就是类加载到内存的过程。

 以上就是整个编译的过程了小编接下来介绍类加载:编译将程序编译成字节码之后下一步就是类加载到内存的过程。

类加载的过程是在虚拟机内存的方法区进行这地方涉及到虚拟机内存。虚拟机内存区域划分为:程序计数器、栈、本地方法栈、堆、方法区(部分区域为运行时常量池)、直接内存。
20140717175657_76340.jpg
程序计数器
程序计数器是一块较小的内存空间它可以看做是当前线程所执行的字节码的行号指示器。在JVM概念模型中字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。
栈用于存储局部变量表、操作数栈、动态链接、方法出口等信息其中局部变量表存放了编译期克制的各种基本数据类型、对象引用它与程序计数器一样都是线程私有的。
本地方法栈
本地方法栈与上面介绍的虚拟机栈作用相似它们的区别不过是虚拟机栈为虚拟机执行Java方法(字节码)服务,而本地方法栈则为虚拟机使用的Native方法服务甚至有的虚拟机会把这两块合二为一。
堆是JVM管理内存最大的一块它是被所有线程共享的一块区域,它的唯一目的是存放对象实例几乎所有的对象实例都在这里分配内存这地方也是垃圾收集管理的主要区域,从内存回收角度看现在垃圾收集器都采用分代收集算法,所以Java堆还可以进一步细分:新生代和老年代、而新生代进一步细分:Eden空间、FromSurvivor空间、To Survivor空间。为了效率考虑堆还可能划分为多个线程私有的分配缓冲区(TLAB)无论如何划分,都与存放内容无关无论哪个区域存放的依然是对象实例它们存在的目的只是为了更好的回收和分配内存而已。