二、对象访问模式

点点圈 提交于 2020-01-01 07:28:53

在这里插入图片描述

句柄、直接指针

很多语言中都存在一个句柄的概念,这个概念的产生主要是在引用数据类型上,比如下面一段代码:

Object obj=new Object();

这段代码可以按照两个部分考虑

  • “Object obj” 声明对象,此处表示的是一个本地引用,那么这个本地的引用一定会本身保留一个堆内存的地址,还会包含一个本地变量表的概念,也就是说,引用类型通过本地变量表才能找到一个堆内存的引用数据
    本地变量表
  • obj=new Object(); 实例化对象, 实例化对象就会开辟堆内存空间。

在进行引用设计的过程中,有两种途径

通过句柄访问

通过句柄访问
当发现需要的是一个引用类型,它会通过一个“对象实例的数据指针”找到一个“对象实例数据”,但是数据本身只是描述对象里的内容,它还需要一个“对象类型数据指针”去找到一个“对象类型数据”。
也就是说,数据和数据的类型是怎么存放的?通过不同的指针来进行不同的引用,这就是通过句柄访问。像C++就是通过句柄访问

直接指针访问

直接指针访问
当发现需要的是一个引用类型,会指向“对象实例数据”,在“对象实例数据”中本身就包含了“对象类型数据指针”。不同于句柄,Java直接找的就是数据,当需要操作数据时再根据“数据类型指针”找方法区的“对象类型数据”

虚拟机规范

以上所见的是HotSpot虚拟机本身实现的引用类型的访问机制,但是对于Java虚拟机存在三种规范:
JVM三套规范标准
SUN公司出了一套虚拟的标准HotSpot。后来,SUN发展到90年代末的时候,有三位工程师出来了,他们创造了一个当时电子商务最伟大的神话BEA,BEA也有一套自己的虚拟机标准JRockit。
最后,Oracle将SUN和BEA都收购了,成为目前拥有虚拟机标准最多的公司,是最权威的。

IBM也拥有一套虚拟机规范JVM’s(别名J9)。

我们使用的虚拟机版本,可以使用java -version命令查看

C:\Users\John>java -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)

虚拟机模式

mixed mode:当前虚拟机采用的是混合模式(“解释与编译”)。该模式中编译是指在JVM运行时候编译处理,不是简单的*.java–>*.class转换那么容易。里面包含一个JIT(Just Is Time即时编译),当JVM启动时,只是对类文件做了一个加载,真正编译执行时是在JVM执行过程中动态完成的。

当然,也可以改变为非mixed模式,只需要追加一些参数:

例子 将Java程序转换为纯解释的模式

C:\Users\John>java -Xint -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, interpreted mode)

例子 将Java程序转换为纯编译的模式

C:\Users\John>java -Xcomp -version
java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, compiled mode)

模式切换,对于我们意义不大,上面切换只是针对于HotSpot进行了一个简单扩展。可是真正核心问题在于JVM要以什么样的方式执行的问题。

运行的形式

JVM运行有两种启动模式:

  • client:本地的客户端程序,单机版程序,占内存小启动快
  • server:服务器模式,启动速度较慢,占用内存较大。

对于服务端,一定要将JVM运行模式设定好。实际上,已经不需要再去设定了。如果想要确定当前的JVM所采用的运行模式可以直接打开一个配置文件:

JDK的安装目录,找到JRE中的jvm.cfg文件,里面有两行配置

-server KNOWN
-client IGNORE

默认启动的是server模式已知启动的。

现在的Java开发已经不去考虑图形化界面,这一原则其实在现在的JVM上也是有所体现。

总结

JVM默认的运行模式:

  • HotSpot虚拟机采用了混合模式来运行
  • 运行的形式是server模式,该模式占用的内存大,启动的速度慢,处理的效率最高。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!