JVM执行的分析

Java运行流程

JVM执行的分析_第1张图片

实际上当JVM将所需要的.class文件加载到JVM进程之中,那么这个过程就需要有一个类加载器(ClassLoader),有了类加载器的好处在于:可以随意指定程序.class文件的所在路径。

JVM:Java虚拟机,所有的程序都要求运行在JVM上,是因为考虑到了可移植性问题,可是如果要想真正去执行程序,你绝对不可能离开操作系统的支持。在Java里面可以使用native实现本地C函数的调用。但是这些都属于程序运行的辅助手段,而真正的程序运行都在“运行时数据区”之中

运行时数据区

JVM执行的分析_第2张图片

在整个的运行时数据区之中,分为如下几块内存空间:

  • 堆内存:保存所有引用数据类型的真实信息;

  • 栈内存:基本类型、运算、指向堆内存的指针;

  • 方法区:所有定义的方法的信息都保存在方法区之中,此区属于共享区;


    JVM执行的分析_第3张图片
  • 程序计数器:
    是一个非常小的内存空间,小的可以忽略;
JVM执行的分析_第4张图片
  • 本地方法栈:
    每一次执行递归的方法处理的时候实际上都会将上一个方法入栈;
JVM执行的分析_第5张图片

在整个Java之中存在有对象池的概念,对象池是对整个常量池的一个规则破坏,因为在JVM启动的时候所有的常量都已经分配好内存空间了,但是String中的intern()方法却可以打破这种限制,动态的进行常量池的内容设置

对象访问模式

Java的引用类型是最为重要的数据处理模型,而整个的引用数据类型数据处理之中会牵扯到:堆内存、栈内存、方法区。

所以下面以一个最简单的程序代码为主:

“Object obj = new Object()”

实例化了一个Object类对象:

  • “Object obj”:描述的是保存在栈内存之中,而保存有堆内存的引用,这个数据会保存在本地变量表中;

  • “new Object()”:一个真正的对象,对象保存在堆内存之中。直观的思路整个引用的操作:

  • 新定义的对象的名称保存在本地变量表,而后在这块区域里面需要确定要与之对应的栈内存空间

  • 通过变量表中的栈地址可以找到堆内存

  • 利用堆内存的对象进行本地方法的调用(方法区)

对于所有引用数据类型的访问实际上是存在有两种模式的

  • 通过句柄访问


    JVM执行的分析_第6张图片
  • 通过直接指针访问

JVM执行的分析_第7张图片

但是在Java之中它直接利用的是对象保存模式,也就是说堆内存里面不再需要保存句柄,而直接保存具体的对象。就相当于省略了句柄到对象间的查找。而后这个对象可以直接进行Java方法区的调用。

总结:引用数据类型在HotSpot中都是直接进行的引用处理,没有句柄池的概念。

你可能感兴趣的:(JVM执行的分析)