zoukankan      html  css  js  c++  java
  • jvm运行时数据区

    内容来自:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1

    pc Register
    java虚拟机支持多线程。每个线程有自己的 pc Register (程序计数器)。在任何时刻,每个线程在执行一个方法的代码,称为该线程的当前方法。如果该方法不是native,pc register 包含虚拟机指令的地址。如果是native方法,则 pc register 中的值是undefined。pc register 的大小可以装下返回地址和指定平台的 native pointer。

    Java Virtual Machine Stacks
    每个jvm线程有个私有的jvm栈,在线程创建时创建。jvm栈存储栈帧,jvm栈类似于C语言中的栈:它存储局部变量和部分结果,参与实现方法调用和返回。除了push和pop栈帧,通常不会直接操作jvm栈,栈帧可能是堆分配的。jvm栈的内存不必连续。
    本规范允许jvm栈是固定大小或根据计算需要动态扩展。如果jvm栈是固定大小的,在创建线程的时候,每个jvm栈的大小可能要单独设置。

    heap
    jvm的堆是所有线程共享的。堆是运行时数据区,为所有类实例和数组分配内存。jvm启动时创建堆,对象的堆存储由gc管理,对象不能显式地释放内存。堆的大小可以自由调整。

    Method Area
    方法取由所有线程共享。方法区存储变异后的代码,与操作系统进程的text段类似。它存储每个类的结构:运行时常量池,字段,方法数据,以及方法和构造函数的代码,包括类中的特殊方法和实例初始化和接口初始化。
    方法区在jvm启动时创建。尽管方法区逻辑上属于堆,简单的实现可以选择不进行垃圾回收和压缩。该版本的规范不指定方法区的位置和管理已编译代码的策略。

    Run-Time Constant Pool
    运行时常量池是class文件中constant_pool表的运行时表现。它包含几种常量,从编译时已知的数值字面量到必须在运行时解析的方法和字段引用。运行时常量池的功能和符号表的功能相似。
    运行时常量池在方法区中分配。在jvm创建类和接口时,为类和接口创建运行时常量池。

    Native Method Stacks
    jvm的实现也许会使用传统的c语言栈,以支持native方法。native方法栈,也许会被jvm指令解释器使用。那些不能加载native方法,和自身不依赖传统栈的jvm实现,不需要提供native方法栈。如果提供了,本地方法栈在线程创建时分配。

    附上Hotspot的堆结构图(源自网上):

  • 相关阅读:
    JQuery实现数组移除指定元素
    美团酒旅面经
    搜狗一面
    360面经
    头条面经
    搜狐笔试题
    kolakoski序列
    函数的节流
    隐藏元素的几种方法
    移动端适配与响应式布局
  • 原文地址:https://www.cnblogs.com/allenwas3/p/8523115.html
Copyright © 2011-2022 走看看