JVM学习笔记--Java运行时数据区域

来源:互联网 发布:微博域名搜索 编辑:程序博客网 时间:2024/05/21 18:48

---------------------声明:本学习系列主要为学习周志明先生的《深入java虚拟机--JVM高级特性与最佳实践》的笔记,并非原创,特此声明。

 

    根据《java虚拟机规范》的规定,Java虚拟机运行时所管理的内存将会包括以下几个运行时数据区域:

1、程序计数器:顾名思义,其作用是作为当前线程所执行的字节码的行号指示器,它是线程私有的。

2、java虚拟机栈:它描述的是Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息,每个方法的执行过程就对应着一个栈帧在虚拟机栈中从出栈到入栈的过程,它也是线程私有的。

3、本地方法栈:其与虚拟机栈类似,其区别在于虚拟机栈为执行JAVA方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务;需要注意的是,虚拟机规范中并没有对如何实现本地方法栈作具体规定,具体的虚拟机可以自由实现它;有的虚拟机直接把虚拟机栈跟本地方法栈合二为一,如Sun HotSpot虚拟机。

4、Java堆:这是大多数比较熟悉的内存区域,对于大多数应用程序来说,java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块,它是被JVM中的所有线程共享的一块内存区域,在JVM启动时就创建;此区域的唯一目的就是存放对象实例,几乎所有的对象实例都存放在这一区域,但是随着JIT编译器的发展与逃逸分析技术的慢慢成熟,栈上分配、标量替换优化技术将会导致一些变化,所有对象实例都存放在这一区域也就不那么绝对了,目前我们仍认为该区域是对象实例存放的主要区域;它同时也是JAVA垃圾收集器管理的主要区域,故有时JAVA堆也称为GC堆。

     JAVA堆的分类:从内存回收的角度看,java堆可细分为:新生代、老年代,再细一点还可划分为Eden空间、From Survivor空间、To Survivor空间等。

5、方法区:其与java堆一样,是JVM中所有线程共享的内存区域,它用于存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。很明显的,它与Java堆还是有明显区别的。在HotSpot虚拟机上,方法区有个别名叫“永久代(Permanent Generation Space 简称 PermGen Space)”,因为在Hot Spot虚拟机的GC分代收集实现中把方法区也纳入收集目标对象,只是该区域中的对象实例在JVM的生命周期内几乎都不会被回收,故称“永久代”。

对于其他虚拟机如BEA JRockit 、IBM J9 则不存在“永久代”这一叫法。

6、运行时常量池(Run time Constant Pool):它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一些常量信息,如各种字面量、符号引用等,这部分常量内容将在类加载后存放到方法区的运行时常量池中。

7、直接内存(Direct Memory):它并不是JVM运行时数据区的一部分,也不是JVM规范中定义的内存区域,但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现。在使用NIO(New Input/Output)类时会接触到这一内存区域。

原创粉丝点击