zoukankan      html  css  js  c++  java
  • jvm的内存结构

    一.java程序的具体执行过程:
      1.java源文件会被java编译器编译成字节码文件
      2.然后由jvm中的类加载器加载各个类的字节码文件
      3.加载完后,由jvm的执行引擎执行
      备注:在执行的过程中jvm一段空间来存储数据:运行时数据区,也称jvm内存

    二.根据jvm规范,jvm把内存划分为了如下几个区域:
      1.程序计数器:也称pc寄存器,用来指示执行哪条命令的,
        每个线程都有一个,为了不影响程序的正常执行顺序。
      2.java栈:存放的是一个个的栈帧,每个栈帧都对应一个方法,栈帧中包括如下:
        1)局部变量表:存放基础数据类型的值,引用类型对象的引用
        2)操作数栈:程序中的所有计算过程都是在借助于操作数栈来完成的。
        3)运行时常量池的引用:指向运行时类中的常量
        4)方法返回地址:返回调用方法的地址
        注:栈的垃圾回收是由系统自动分配的,每个栈对应一个线程,也就是说每个线程都有自己的栈
      3.本地方法栈
        执行原理与java栈相似,只是它为执行本地方法服务.
      4.堆区
        存放对象的本身以及数组,堆被所有线程共享,在jvm中只有一个堆
      5.方法区,常称为永久代,因为执行GC的情况很少,其上的gc主要针对常量池的回收和已加载类的卸载.
        1)运行时常量池:在类和接口被加载到JVM后,对应的运行时常量池就被创建出来,
          当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中
        2)静态域:存放在对象中用static定义的静态成员
        注:
          1)方法区中存取了每个类的信息,静态变量,常量以及编译器编译后的代码
          2)String常量也是存放在常量池中的.class文件中的一些数据.
          3)常量池是指在编译器被确定,并保存在已编译的
          4)方法区是全局共享的,

    注释:java的内存分配细分:
    1)寄存器:我们在程序中无法控制
    2)栈:存放基本数据类型和对象的引用
    3)堆:存放用new产生的数据
    4)静态域:存放在对象中用static定义的静态成员
    5)常量池:存放常量
    6)非RAM(:随机存取存储器,也称为主存,
    与cpu直接交互数据大的内部存储器)存储:硬盘等永久存储空间

    注:从java5.0开始,java虚拟机在启动时会实例化9个对象池.这九个对象池分别存储8种基本数据类型的包装类和String对象
    当在程序中直接用双引号给字符串对象时,jvm就到String的对象池中检查是否有一个值相同的对象,如果有返回现有对象的引用
    如果没有,则在对象池中创建,如果是new一个对象,则是直接在对象池中创建,没有上述操作
    String str1 = "hello";
    String str2 = "hello";
    String str3 = new String("hello");

    str1 == str2 true;
    str2 == str3 false;

  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12545388.html
Copyright © 2011-2022 走看看