JVM结构浅析

JVM运行时数据区

  1. 程序计数器 Program Counter Register

    程序计数器是用于存储每个线程下一步将执行的JVM指令,如该方法为native,则程序计数器不存储任何信息。

  2. JVM栈 JVM Stack

    JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量、部分返回的结果以及Stack Frame,非基本类型的对象在栈上存放一个指向堆的地址

  3. heap

    JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象会等待GC回收

    堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,所以在new对象的时候会有较大的内存开销。

  4. 方法区 Method Area

    Sun JDK中这块区域对应的为PermanentGeneration,有称为持久代

    方法区存放了所加载的类信息包括名称、修饰符、类中的静态变量、类中定义为final类型的常量、类中的Field、方法。

    当通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区,同时方法区也是全局共享的,在一定条件下也会被垃圾回收,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误。

  5. 本地方法栈 Native Method Stacks

    JVM采用本地方法栈来支持本地方法的执行,此区域存储每个native方法调用的状态。

  6. 运行时常量池 Runtime Constant Pool

    存放的为类中固定的常量信息、方法和属性的引用信息等。

    是从方法区中分配出来的空间。

    JVM在加载类时会为每个class分配一个独立的常量池,运行时字符串常量池是全局共享的。

JVM结构示意图

JVM结构图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容