zoukankan      html  css  js  c++  java
  • 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):就是一个标识,对生命周期没有影响。

         

      

      

  • 相关阅读:
    解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
    ios 数组排序
    六年谈游戏工作室与游戏开发过程简介(转)
    mysql按位的索引判断值是否为1
    mysql按位的索引判断位的值
    git bash here右键菜单
    将VSCode添加到右键
    给vscode添加右键打开功能
    winrar压缩过滤文件及文件夹
    编译wxWidgets
  • 原文地址:https://www.cnblogs.com/whtblog/p/8989487.html
Copyright © 2011-2022 走看看