JVM 内存模型

前言: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. 有的区域随着虚拟机进程的启动而存在, 有些区域则依赖用户进程的启动和结束而建立和销毁. java 运行时内存分为— 程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。

 1. 程序计数器

       是一块较小的内存空间, 线程私有, 可以看作是当前线程所执行的字节码的行号指示器。 为了线程切换后能恢复到正确的执行位置, 每条线程都需要一个独立的程序计数器

   2. Java虚拟机栈

   与程序计数器一样,  也是线程私有, 生命周期与线程相同。 它描述 的是Java方法执行的内存模型:每个方法执行的同时都会创建一个栈帧(Stack Frame) 用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至执行完成的过程, 就是对应一个栈帧在虚拟机中入栈和出栈的过程。

   3. 本地方法栈

   与虚拟机栈发挥的作用相似, 不同的是本地方法栈为虚拟机使用的Native方法服务。

   4. Java 堆

   对大多数应用来说, Java堆 是Java 虚拟机所管理的内存中最大的一块。 Java堆 是被所有线程共享的 一块内存区域, 在虚拟机启动时创建。 此内存的唯一目的就是存放对象的实例, 几乎所有的对象实例都要在堆上分配。

   Java 堆是垃圾收集器管理的主要区域, 因此很多时候也被称为 “GC堆”。

   5. 方法区

   与Java堆一样, 是所有线程共享的内存区域, 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。对于习惯在HotSpot虚拟机上开发的开发者来说, 很多人更愿意称为“永久代”, 本质上两者并不等价, 仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法却,这样能够省去专门为方法区编写内存管理的代码工作。

   5-1. 运行时常量池

   是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外, 还有一项信息就是常量池, 用于存放编译期生成的各种字面量和符号引用, 这部分内容将在类加载后进入方法区运行时常量池中存放。

 

posted @ 2015-11-03 17:44  hewep  阅读(107)  评论(0编辑  收藏  举报