Java内存区域总结

Java内存区域总结

一、Java内存模型

 

 

 

Java运行时数据区一般分为:程序计数器区、方法区、Java栈、Java本地栈、Java堆组成。

1、程序计数器

程序计数器是线程私有的一块较小的内存区域,用于保存当前线程执行字节码的行号指示器,线程的切换、异常都能正确的恢复到指定的要执行的字节码位置都是这个行号指示器的功能,这个区域是一个唯一一个没有抛出OutOfMemoryError的异常。

2、Java栈

Java栈也是线程私有的一块内存区域,它的生命周期与线程的生命周期相同。一个方法被执行的同时会创建一个栈帧,将其压入栈中,方法执行完成的同时就会把此栈帧弹出栈,也就是一个方法从被执行到退出也就是一个栈帧入栈出栈的过程。以前我们经常说的”Java堆”和“Java栈”,很粗的一个说法 —堆也可能说的另外的一个内存区域-堆,栈应该说的不是Java栈,应该是Java栈中的局部变量表-用于保存基本数据类型信息(如:int float long )和对象引用指针、返回类型指针。虚拟机设置参数: -Xxs200k (注意栈的内存大小最少为160k),也可能出现OutOfMemoryError的异常,当请求栈的深度大于JVM所允许的栈的最大深度的时候会抛出一个SatckOverflowError的异常。

3、方法区

方法区是所有线程共享的一片内存区域,用于保存类信息、方法名、静态变量、常量等信息。我们也成为永久代。常量池是方法区的一部分,用于保存字面量和符号。在JVM中设置参数为:-XX:PermSize100M -XX:MaxPermSize300M。也可能出现OutOfMemoryError的异常

4、堆

堆这块内存区域是最为重要的一片内存区域,几乎所有的对象实例都保存在此区域,也是GC管理最重要的区域,也成为GC堆。堆也可以细划分为:老年代和新生代。JVM设置参数:

-Xms10M -Xmx100M 当申请的内存无法申请到足够的内存的时候会出现OutOfMemoryError的异常信息。

5、对象访问

对象访问也就是reference类型如 Object object = new Object();

 

Object object  这个反应到虚拟机栈中的局部变量表中保存reference类型出现,new Object();这会出现在Java堆中将对象实例放在此内存区域,Object 类型的体现出这些信息保存在方法区中。

         reference类型数据访问对象有两种:

5.1、基于句柄池

基于句柄池的对象访问方式是在Java堆中创建一个句柄池,句柄池中保存堆中实例对象的内存地址,而reference 类型的数据保存了堆中句柄池中的一个地址。

5.2、直接内存地址

直接内存地址是reference类型的数据保存的就是Java堆中的所在的实例的地址。

6、直接内存

直接内存不是JVM中的运行时数据区的一部分,这部分也会被频繁的使用。在JDK1.4中引入了NIO 基于通道和缓冲区的新的I/O,可以使用本地函数直接在分配堆以外的内存,在堆中保存一个DrectByteBuffer的直接内存的地址,这样操作可以避免了本地堆和Java堆来回复制数据的问题。这要注意我们在配置Java堆参数的时候一定要考虑到直接内存所占内存的一部分。

猜你喜欢

转载自qq466862016.iteye.com/blog/2365863