zoukankan      html  css  js  c++  java
  • JVM的堆(heap)、栈(stack)和方法区(method)

    JVM主要由类加载器子系统、运行时数据区(内存空间)、执行引擎以及与本地方法接口等组成。其中运行时数据区又由方法区Method Area、堆Heap、Java stack、PC寄存器、本地方法栈组成。

    堆区:
    1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
    2.jvm只有堆区(heap)和方法区(下面)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
    3.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。

    栈区:  
    1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
    2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
    3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
    4.由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.

    静态区/方法区:
    1.方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
    2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
    3.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

    方法区

    类型信息和类的静态变量都存储在方法区中。方法区中对于每个类存储了以下数据:

    a.类及其父类的全限定名(java.lang.Object没有父类)

    b.类的类型(Class or Interface)

    c.访问修饰符(public, abstract, final)

    d.实现的接口的全限定名的列表

    e.常量池

    f.字段信息

    g.方法信息

    h.静态变量

    i.ClassLoader引用

    j.Class引用

    可见类的所有信息都存储在方法区中。由于方法区是所有线程共享的,所以必须保证线程安全,举例来说,如果两个类同时要加载一个尚未被加载的类,那么一个类会请求它的ClassLoader去加载需要的类,另一个类只能等待而不会重复加载。

    此外为了加快调用方法的速度,通常还会为每个非抽象类创建私有的方法表,方法表是一个数组,存放了实例可能被调用的实例方法的直接引用。方法表对于多态有非常重要的意义,具体可以参照《浅谈多态机制的意义及实现》一文中“多态的实现”一节。

    在Sun JDK中,方法区对应了持久代(Permanent Generation),默认最小值为16MB,最大值为64MB。  

    http://blog.hesey.net/2011/04/introduction-to-java-virtual-machine.html

  • 相关阅读:
    CCF CSP 题解
    CCF CSP 2019032 二十四点
    CCF CSP 2018121 小明上学
    CCF CSP 2019092 小明种苹果(续)
    CCF CSP 2019091 小明种苹果
    CCF CSP 2019121 报数
    CCF CSP 2019031 小中大
    CCF CSP 2020061 线性分类器
    CCF CSP 2020062 稀疏向量
    利用国家气象局的webservice查询天气预报(转载)
  • 原文地址:https://www.cnblogs.com/milton/p/4541415.html
Copyright © 2011-2022 走看看