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;

  • 相关阅读:
    python手写神经网络实现识别手写数字
    记录:tensoflow改错TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a float into a Te
    6 TensorFlow实现cnn识别手写数字
    记录:python读取excel文件
    matlab手写神经网络实现识别手写数字
    把当前文件夹的xlsx或xls文件合并到一个excel文件中的不同sheet中
    Mac卸载go
    vue中axios的post和get请求示例
    vue配置请求拦截器和响应拦截器
    vue中main.js配置后端请求地址
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12545388.html
Copyright © 2011-2022 走看看