当前位置:首页 > 虚拟机 > 正文

深入理解java虚拟机文字版


一、java虚拟机到底是什么,谁能给我说说Java虚拟机是通过模拟软件在真实计算机上部署的虚拟机。Java虚拟机有自己的假想硬件,如处理器、堆栈、寄存器等。并且还有相应的引导系统。
1.为什么使用Java虚拟机
Java语言的一个非常重要的特性就是它与平台的独立性。Java虚拟机的使用是实现这一功能的关键。一种通用的高级语言如果要运行在不同的平台上,至少必须编译成不同的目标代码。Java语言虚拟机诞生后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模型Java虚拟机保存了与特定平台相关的信息,因此Java语言编译器只需要生成在Java虚拟机上运行的目标代码(字节码),无需修改即可跨平台运行。Java虚拟机执行字节码时,会将字节码解释为机器指令,以便在特定平台上执行。
2.谁需要了解Java虚拟机
Java虚拟机是Java语言基本实现的基础。任何对Java语言感兴趣的人都应该拥有它。了解Java虚拟机的概述。这有助于理解Java语言的一些属性,也有助于使用Java语言。对于想要在特定平台上部署Java虚拟机的软件工作者、Java语言编译器作者以及想要使用硬件芯片来部署Java虚拟机的人来说,必须对Java规范有深入的了解。虚拟机。另外,如果想要扩展Java语言或者将其他语言编译成Java语言字节码,也需要对Java虚拟机有深入的了解。
二、深入理解jvm原理之逃逸分析最近在研究Java虚拟机的原理,打算写一篇文章来记录一下我觉得有趣的内容。优胜劣汰是大自然的进化论,把它应用到Java虚拟机上一点也不夸张。JVM在幸存下来之后又不断发展。有些基于优化,例如指令重新排序,有些基于分析技术,例如比如关系分析或者逃逸分析等,今天我们重点讲一下JVM中的优化分析技术——逃逸分析来自《深入理解Java虚拟机》;
逃逸分析一般分为分为两种:一种基本行为是分析对象的动态范围方法可以被外部方法引用,比如B.将其作为调用参数传递。在其他对象中,这称为方法转义。它甚至被外部线程引用,例如B.通过赋值给变量或者其他线程中可以访问的变量,这种优化行为称为线程逃逸。最终效果如何?牛的总价值需要在实践中检验,d/>
栈上的分配:无论你是C#还是Java程序员,大家都知道对象是在Java堆上创建的,并且在栈上分配的Java堆在线程(Java线程)中是共享且可见的。而虚拟机垃圾回收就是回收不再可用的对象。无论哪种类型的垃圾收集器,都需要检查和组织可重用的对象。如果确定的话,回收和清理会采取一个方法,如果没有从该方法中逃逸,则该对象将直接在堆栈上分配。帧栈打开时对象占用的内存空间也会被破坏,对系统的压力会更小;
消除同步:线程同步本身是一个比较耗时的过程(为什么这么耗时,可以查询用户线程和内核线程的相关知识)如果确认:某个对象没有被其他线程访问。那么变量的读写就不会与其他线程竞争,并且可以消除为此类变量实现的同步。
标量替换:也称为标量,表示指不再可以读取的数据。被分解成更小的数据,例如、long、等价类型和引用类型。它们不能进一步分解,反之,如果可以进一步分解,则称为集合。Java对象是典型的聚合。当一个对象被分解时,根据程序访问情况,将其替换为基类型,转义分析确定该对象没有被外部对象使用,因此程序执行时不会创建该对象。而是用它的几个成员变量来创建这个方法(栈上创建的数据很大,大概率被JVM分配到物理机的高速寄存器中存储),这也创造了条件以便进一步优化;
逃逸分析的诸多好处正在逐渐被发现,Java8默认启用。对于逃逸分析,可以通过-XX:+DoEscapeAnalysis来启用或禁用该选项,稍后可以用卡带和截图来检查;