想要彻底搞懂Jvm虚拟机,看了这篇就够了
了解了辅助方法执行的 Java 虚拟机栈的结构后,接下来就要考虑 Java 类中方法的调用了。就像将大象放进冰箱,方法的调用也不是上来就之间执行方法的,而是分为以下两个步骤:
为什么还要加一个方法调用的步骤呢?因为一切方法调用都是在 Class 文件中以常量池中的符号引用存储的,这就导致了不是我们想要执行哪个方法就能立刻执行的,因为我们首先需要根据这个符号引用(其实就一字符串)找到我们想要执行的方法,而这一过程就叫做方法调用。当找到这个方法之后,我们才会开始执行这个方法,也就是基于栈的解释执行。 想要调用一个方法,我们先来看一下虚拟机中有哪些指令可以进行方法调用:方法调用字节码指令。 这些字节码会触发不同的方法调用,总体来说,有以下几种:
确定了要调用的方法具体是哪一个了之后,就可开始基于栈的解释执行了,这个时候,方法才真正的被执行。 此外,还需要了解一下 Java 的动态类型语言支持。 说说虚拟机性能监控及故障处理 常用的 JDK 命令行工具:JDK 命令行工具。 JVM 常见的参数设置已经设置经验可见:JVM 常见参数设置。 虚拟机调优案例分析可见:虚拟机调优案例分析。 说说 JIT 优化 JIT (Just In Time),也就是即时编译,首先我们需要知道 什么是 JIT? 然后,对于 HotSpot 虚拟机内的即时编译器运作过程,我们可以通过以下 5 个问题来研究它:
此外,JIT 并不是简单的将热点代码编译成机器码就收工的,它还会对代码的执行进行优化,主要有以下几种经典的优化技术:
说说 Java 的内存模型(JMM) 这部分内容主要与并发编程的内容相关,所以详细介绍会跳到另一个 repo:Java-Concurrency-in-Practice。 Java 的内存模型主要就是研究一个变量的值是怎么在主内存、线程的工作内存和 Java 线程(执行引擎)之间倒腾的。就是说虽然 Java 内存模型规定了所有变量都存储在主内存中,但是每个线程都有一个自己的工作内存,里面存着从主内存拷贝来的变量副本,Java 线程要对变量进行修改,都是先在自己的工作内存中进行,然后再把变化同步回主内存中去。 这样做是由于计算机的存储设备和处理器的运算速度有着几个数量级的差距,所以需要在主内存和 Java 线程间加入一个工作内存作为缓冲,但这也同时会导致主内存和工作内存间的缓存一致性问题,所以当两个工作内存中关于同一个变量的值发生冲突时,需要一定的访问规则来确定主内存以怎样的顺序同步这个变量,也就是说该听哪个工作内存的。而 Java 的内存模型的主要目标就是定义这个规则,即虚拟机如何将变量存储到内存或是从内存中取出的。 简单的来讲,就是掌握 Java 内存模型中的 8 个原子操作,并且知道 Java 内存间是如何通过这 8 个操作进行变量传递的。 其实 Java 的内存模型就是围绕着在并发的过程中如何处理 原子性、可见性、有序性 这 3 个特征建立的。同时 Java 除了可以依靠 volatile 和 synchronized 来保证有序性外,它自己本身还有一个 Happens-Before 原则,依靠这个原则,我们就可以判断并发环境下的两个操作是否可能存在冲突了。 【编辑推荐】
点赞 0 (编辑:东莞站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |