JVM笔记2-Java虚拟机内存管理简介

java虚拟机内存管理图以下图所示:java

1.线程共享区,是全部的线程所共用的,线程共享区有一下几个组成:优化

  1.方法区:线程

        1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法,4.接口等),常量,静态变量,即时编译器编译后的代码等数据。对象

        2.垃圾回收器也会光顾这个区域,例如常量池。blog

        3.HotSpot中用方法区来实现永久代。这样的作的好处就是,垃圾回收器能够像管理java堆同样管理这部份内存,省去了为方法区编写内存管理的工做,注意的是这接口

        仅仅限于HotSpot中,其余的虚拟机并无永久代这个概念,虚拟机规范中,永久代不等于方法区,并且没有进行详细的规范说明。用方法区实现永久代并非一个很好的途径内存

        HotSpot在JDK1.7中进行的改进。get

 

  2.java堆:编译器

        1.存储对象实例,能够人做为全部对象的实例存储在这里,涉及编译优化和虚拟机优化的时候有些对象实例并不存储在这里。虚拟机

        2.垃圾收集器管理的主要区域。

        3.长时间存活的对象实例会被放入老年代去,不长期存活的会在新生代中。

        4.当对空间申请完后会抛出OutOfMemory的内存溢出异常。

  

2.线程独占区,是每个线程都有本身独立的虚拟机栈,本地方法栈,程序计数器。

  1.虚拟机栈:存储方法运行时所需的数据,成为栈帧。

    1.虚拟机栈描述的是java方法执行的动态内存模型。

    2.栈帧:每一个方法的执行都会建立一个栈帧,伴随着方法从建立到执行完成。用于存储局部变量表,操做数栈,动态链接,方法出口等。

    3.局部变量表:

      1.存放编译期可知的各类变量类型,引用类型,returnAddress类型。

      2.局部变量表的内存空间在编译期完成分配,当进入一个方法时,这个方法须要在帧分配多少内存是固定的,方法运行期间不会改变局部变量表的大小。

    4.大小:虚拟机栈的空间是有限的。举个例子。以下面代码:

>>>>阅读全文

相关文章
相关标签/搜索