jvm--内存管理--内存区域与内存溢出异常

1:jvm将java运行时的数据区划分成了5个部分,分别是:程序计数器、堆、方法区、本地方法栈、虚拟机栈。其中经常用的就是堆了。

2: 程序计数器

    是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的情况的区域。程序计数器相当于当前线程执行的程序的行号指示器。在虚拟机的概念模型中字节码解释器工作时就是通过改变程序计数器的值来选取下一条要指向的代码。java实现多线程就是通过线程的不断切换并分配处理器的执行时间来实现的。以确保在任何时刻处理器只能执行任何一条线程的操作。那么为了线程切换后恢复到正确的位置就需要每个线程都有一个程序计数器来保存当前执行的行号。所以说程序计数器是每个线程私有的。如果线程正在执行java程序,那么程序计数器记录的就是字节码指令的地址。如果是native方法,那么就设置为空

 

3:java虚拟机栈

    与程序计数器一样,也是线程私有的,因而生命周期与线程一样。虚拟机栈描述的是java程序执行的内存模型,就是每个方法在程序执行的时候都有一个栈帧,存放局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成的过程就对应着一个栈帧在虚拟机栈中入栈出栈的操作。

人们常说的栈内存就是指虚拟机栈,或者说是虚拟机栈中的局部变量表。

      局部变量表存放了编译期间就能知道的各种数据的基本类型(boolean、int、long、byte、char、float、double、short)、对象的引用(reference).注意局部变量表在编译期间就像确定大小。在运行的时候是不会改变局部变量表的大小的。

  在java虚拟机规范中在java虚拟机栈中规定了两个异常:StackOverFlowError 和OutOfMemoryError

   StackOverFlowError是指线程请求的深度大于虚拟机所允许的深度。OutOfMemoryError是指如果允许java栈进行扩展,然后仍然无法获取需要的内存

 

 

 

4:本地方法栈

    本地方法栈与java虚拟机栈很相似。只不过java虚拟机栈执行的是java程序,本地方法栈则是为native方法服务的。与java虚拟机栈一样也会抛出那两个异常

 

5:java堆

   对于大对数的应用来说,java堆在java虚拟机管理的内存中占用最大的一块。java对是所有的线程共享的一块内存区域。在虚拟机启动的时候创建。唯一目的就是存放对象实例。

  java堆是虚拟机垃圾回收的主要区域。因此很多时候成为“GC”堆。当然在java堆中也有为多个线程私有的分配缓冲区。无论怎么划分都与存放的内容无关,都是为了更好地管理内存、分配内存、回收内存的

  java堆可以是物理上不连续但一定要在逻辑上连续。

 

6:方法区

    方法区也是各个线程共享的内存区域,用于  存储已被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的字节码代码。

  在方法区中可以选择不实现垃圾回收。相对而言,在这个区域里垃圾回收很少出现。对于这个区域的垃圾回收就是对常量池的回收和对类型的卸载。

 

 

 

6.1:运行时的常量池 ----属于方法区

     Class文件中除了类信息(版本、字段、消息、接口)以外还有就是常量池 ------用于存放编译期间生成的各种字面常量和符号的引用。

运行时的常量池具有动态性,它允许运行期间把新的常量对象放入池中。egString.intern()方法

 

posted @ 2015-07-28 00:50  奋斗妮  阅读(27)  评论(0)    收藏  举报