加入收藏 | 设为首页 | 会员中心 | 我要投稿 东莞站长网 (https://www.0769zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

想要彻底搞懂Jvm虚拟机,看了这篇就够了

发布时间:2019-07-31 23:38:23 所属栏目:空间 来源:佚名
导读:副标题#e# 引言 本文的使用方法: 本文从头读到尾就是一个虚拟机大部分知识点的框架,就像一颗搜索树一样,我们想要了解哪一部分知识,就从根节点开始搜索,直到找到我们想要了解的知识所在的叶节点或者子树。不过如果把所有的知识都在一篇文章中列出来那文

了解了辅助方法执行的 Java 虚拟机栈的结构后,接下来就要考虑 Java 类中方法的调用了。就像将大象放进冰箱,方法的调用也不是上来就之间执行方法的,而是分为以下两个步骤:

  • 方法调用:确定被调用的方法是哪一个
  • 基于栈的解释执行:真正的执行方法的字节码

为什么还要加一个方法调用的步骤呢?因为一切方法调用都是在 Class 文件中以常量池中的符号引用存储的,这就导致了不是我们想要执行哪个方法就能立刻执行的,因为我们首先需要根据这个符号引用(其实就一字符串)找到我们想要执行的方法,而这一过程就叫做方法调用。当找到这个方法之后,我们才会开始执行这个方法,也就是基于栈的解释执行。

想要调用一个方法,我们先来看一下虚拟机中有哪些指令可以进行方法调用:方法调用字节码指令。

这些字节码会触发不同的方法调用,总体来说,有以下几种:

  • 解析调用
  • 分派调用(没有在解析调用中将符号引用转化为直接引用的方法就只能靠分派调用了)
  • 静态分派(方法重载)
  • 动态分派(方法重写)

确定了要调用的方法具体是哪一个了之后,就可开始基于栈的解释执行了,这个时候,方法才真正的被执行。

此外,还需要了解一下 Java 的动态类型语言支持。

说说虚拟机性能监控及故障处理

常用的 JDK 命令行工具:JDK 命令行工具。

JVM 常见的参数设置已经设置经验可见:JVM 常见参数设置。

虚拟机调优案例分析可见:虚拟机调优案例分析。

说说 JIT 优化

JIT (Just In Time),也就是即时编译,首先我们需要知道 什么是 JIT?

然后,对于 HotSpot 虚拟机内的即时编译器运作过程,我们可以通过以下 5 个问题来研究它:

  • 为什么要使用解释器与编译器并存的架构?
  • 为什么虚拟机要实现两个不同的 JIT 编译器?
  • 什么是虚拟机的分层编译?
  • 如何判断热点代码,触发编译?
  • 什么是热点代码?(两种)
  • 什么是 “多次” 执行?
  • HotSpot 采用的是基于计数器的热点探测方法,并且为了对两种热点代码进行探测,每个方法有 2 个计数器
  • 方法调用计数器
  • 回边计数器
  • HotSpot 热点代码探测流程
  • 热点代码编译的过程?

此外,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 原则,依靠这个原则,我们就可以判断并发环境下的两个操作是否可能存在冲突了。

【编辑推荐】

  1. JVM很难?或者你看完这篇文章就够了
  2. 你真的了解JVM?JVM中有哪些内存区域,都有哪些作用?
  3. 虚拟机不能上网?虚拟机和宿主机不能互通?一文搞定网络问题
  4. 深入理解Java虚拟机(高效并发)
【责任编辑:武晓燕 TEL:(010)68476606】
点赞 0

(编辑:东莞站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读