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的堆结构图(源自网上):

  • 相关阅读:
    restframework 生成接口文档
    django simpleRoute 简化路由
    django 视图GenericView
    备份问题-原生问题
    django 中如何使用celery 和redis
    主外键定义与主从表关系
    django restframework 钩子函数:全局钩子和局部钩子
    QuerySet Django 几个必会方法
    django restframework -模型序列化高级用法终极篇
    django User.objects.get()报错 raise self.model.DoesNotExist手动处理解决办法
  • 原文地址:https://www.cnblogs.com/allenwas3/p/8523115.html
Copyright © 2011-2022 走看看