上篇博客,我们简介了什么是jvm,我们知道了jvm的体系结构:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。今天我们来分析一下运行时数据。
Java运行时内存区
Java的运行时内存组成如下图所示:
其中,对于这各个部分有一些是线程私有的,其他则是线程共享的。
依赖用户线程的启动和结束而建立和销毁(线程私有):
•程序计数器
当前线程所执行的字节码的行号指示器
•Java虚拟机栈
Java方法执行的内存模型,每个方法被执行时都会创建一个栈帧,存储局部变量表、操作栈、动态链接、方法出口等信息。
•每个线程都有自己独立的栈空间
•线程栈只存基本类型和对象地址
•方法中局部变量在线程空间中
•本地方法栈
Native方法服务。在HotSpot虚拟机中和Java虚拟机栈合二为一。
随着虚拟机进程的启动而存在(线程共享):
•Java堆
存放对象实例,几乎所有的对象实例以及其属性都在这里分配内存。
•方法区
存储已经被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等数据。
•运行时常量池
方法区的一部分。用于存放编译期生成的各种字面量和符号引用。
•直接内存
NIO、Native函数直接分配的堆外内存。DirectBuffer引用也会使用此部分内存。
对象访问
Java是面向对象的一种编程语言,那么如何通过引用来访问对象呢?一般有两种方式:
1.通过句柄访问
2.直接指针
此种方式也是HotSpot虚拟机采用的方式。