JVM之运行时数据分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaibian0823/article/details/52077766

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

Java运行时内存区

       Java的运行时内存组成如下图所示:
这里写图片描述
       其中,对于这各个部分有一些是线程私有的,其他则是线程共享的。

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

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

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

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

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

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

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

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

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

对象访问

       Java是面向对象的一种编程语言,那么如何通过引用来访问对象呢?一般有两种方式:
       1.通过句柄访问
               这里写图片描述
       2.直接指针
               这里写图片描述
此种方式也是HotSpot虚拟机采用的方式。

猜你喜欢

转载自blog.csdn.net/gaibian0823/article/details/52077766