上篇博客,我们简介了什么是jvm,我们知道了jvm的体系结构:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。今天我们来分析一下运行时数据。

Java运行时内存区

       Java的运行时内存组成如下图所示:

jvm 运行参数 javaagent jacocoagent jvm运行时数据_Java


       其中,对于这各个部分有一些是线程私有的,其他则是线程共享的。

依赖用户线程的启动和结束而建立和销毁(线程私有):

       •程序计数器
       当前线程所执行的字节码的行号指示器

       •Java虚拟机栈
       Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧,存储局部变量表、操作栈、动态链接、方法出口等信息。
       •每个线程都有自己独立的栈空间
       •线程栈只存基本类型和对象地址
       •方法中局部变量在线程空间中

       •本地方法栈
       Native方法服务。在HotSpot虚拟机中和Java虚拟机栈合二为一。

随着虚拟机进程的启动而存在(线程共享):

       •Java堆
       存放对象实例,几乎所有的对象实例以及其属性都在这里分配内存。

       •方法区
       存储已经被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。

       •运行时常量池
       方法区的一部分。用于存放编译期生成的各种字面量和符号引用。

       •直接内存
       NIO、Native函数直接分配的堆外内存。DirectBuffer引用也会使用此部分内存。

对象访问

       Java是面向对象的一种编程语言,那么如何通过引用来访问对象呢?一般有两种方式:

       1.通过句柄访问

              

jvm 运行参数 javaagent jacocoagent jvm运行时数据_局部变量_02


       2.直接指针

              

jvm 运行参数 javaagent jacocoagent jvm运行时数据_方法区_03


此种方式也是HotSpot虚拟机采用的方式。