加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

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

发布时间:2019-07-31 21:30:07 所属栏目:站长百科 来源:佚名
导读:弁言 本文的行使要领: 本文从新读到尾就是一个假造机大部门常识点的框架,就像一颗搜刮树一样,我们想要相识哪一部门常识,就从根节点开始搜刮,直到找到我们想要相识的常识地址的叶节点可能子树。不外假如把全部的常识都在一篇文章中列出来那文章就太长

相识了帮助要领执行的 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

(编辑:湖南网)

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

热点阅读