jvm内存结构

ref:http://www.cnblogs.com/ityouknow/p/5610232.html

暂不整理:JVM更多:http://www.cnblogs.com/ityouknow/category/437541.html

1、JVM的内存结构

  1.1:Java程序交给JVM执行,因此Java的内存区域划分实际上是JVM的内存区域划分。

    Java源代码(.java)->字节码文件(.class)->jvm加载字节码文件->jvm执行引擎

    jvm执行Java程序时,会用一段空间(运行时数据区)存储执行期间的数据与相关信息。内存划分是对jvm运行时数据区进行的内存划分。

  1.2、运行时数据区的划分:

    堆内存:堆区是所有线程共享的区域。

    方法区:又名非堆(Non-Heap),是线程共享区域。

    栈  :是线程私有的。

    程序计数器:线程私有。

2、各个分区的作用

  2.1:堆(Heap):

    2.1.1:根据jvm规范,该区域可以是物理上的不连续空间,当堆区无空间完成实例分配,页无法再扩展时,会抛出OutOfMemoryError异常。

    2.1.2:几乎所有的实例对象的分配都在堆区完成。该区也是垃圾收集器(GC)管理的主要区域,一般采用分代收集算法进行回收。

    2.1.3:堆区又分为新生代和老年代,新生代又分为:Eden空间、FromSurvivor空间和To Survivor空间,默认比例8:1:1。

  2.2:方法区(Method Area):

    2.2.1:该区存储已被jvm加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

    2.2.2:该区的垃圾回收的主要对象是常量池和类型的卸载,也可以选择不实现垃圾回收。

    2.2.3:内存分配无法满足时抛出OutOfMemoryError。

  2.3:程序计数器(program counter register):

    2.3.1:该区是当前线程所执行的字节码的行号指示器,是线程私有内存。

    2.3.2:此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

   2.4:JVM栈(JVM Stacks):

    2.4.1:该区描述Java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

    2.4.2:该区存在两种异常:

      StackOverflowError异常:线程请求栈深超过jvm允许深度。

      OutOfMemoryError异常:jvm无法申请足够的内存时。

  2.5:本地方法栈(Native Method Stacks)

    该区为jvm调用的Native方法服务,也会抛出StackOverflowError和OutOfMemoryError异常。

3:方法区详细:

http://www.cnblogs.com/protected/p/6419217.html

4、(补充)java中的强、软、弱、虚引用:java.lang.ref包

    

  • 强引用:如下,a=null时,此时没有引用指向该A对象,应该被GC,但是由于B依赖A,A不能被GC,造成内存泄漏(A占的内存不会被释放);

     A a=new A(); B b=new B(a);  a=null;  

  • 软引用(SoftReference):多用于缓存处理:如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。常和一个引用队列搭配使用。
  • 弱引用(WeakReference):a=null时,A只被弱引用依赖,A会被GC,避免了内存泄露。GC一旦扫描到弱引用直接回收。 

    A a = new A(); WeakReference b = new WeakReference(a);//B b = new B(a);a = null; 

  • 虚引用(PhantomReference):就是一个标识,对生命周期没有影响。

     

  

  

原文地址:https://www.cnblogs.com/whtblog/p/8989487.html