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

    1、程序计数器(PCR)

    JVM就是通过读取程序计数器的值来决定下一条需要执行的字节码指令。

    每个线程都需要有一个独立的PCR,各线程间互不影响。

    唯一没有内存溢出的区域。

    (为了多线程而生的,单线程情况下完全不需要他。程序计数器是每个线程独有的,并非线程共享的,是线程安全的。)

     

    2、栈内存

    以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈和出栈。

    某个线程正在执行的方法被称为该线程的当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。在线程执行一个方法时,它会跟踪当前类和当前常量池。此外,当虚拟机遇到栈内操作指令时,它对当前帧内数据执行操作。

    每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧。而这个新帧自然就成为了当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等数据。

    return或者抛出异常时弹出当前帧。

    线程私有的。任何线程都不能访问另一个线程的栈数据,因此我们不需要考虑多线程情况下栈数据的访问同步问题。当一个线程调用一个方法时,方法的的局部变量保存在调用线程Java栈的帧中。只有一个线程能总是访问那些局部变量,即调用方法的线程。

     

    3、本地方法栈

    跟上述栈内存一样,但是他是面对JVM的native方法。

     

    4、堆内存

    堆内存用于存放由new创建的对象和数组,在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。

    所有线程共享,在JVM启动时创建。

     

    5、方法区(内有运行时常量池:常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。)

    当jvm使用类装载器装载某个类时,它首先要定位到对应的class文件,然后读入这个class文件,最后提取该文件的内容信息,并将这些信息存储到方法区,最后返回一个class实例。

    存储类的描述信息(类的全限定名,访问修饰符,字段,方法等)。

     

    6、直接内存

    我好菜呀
  • 相关阅读:
    python字符串
    Python问题:SyntaxError: Non-ASCII character 'xe2' in file
    windows 运行库与dll文件
    sublime python 配置内容
    sublime ctrl b突然不能用解决方法
    c++ primer 的 textquery 例子。
    虚函数表
    理解各种数据类型和简单类在内存中的存在形式。
    最短路径纯贪心算法。
    中缀表达式生成二叉树
  • 原文地址:https://www.cnblogs.com/LinsenLi/p/9584241.html
Copyright © 2011-2022 走看看