手机app网站,学动漫制作专业后悔吗,建立装修网站设计,软件生成器下载关于什么是 JVM#xff0c;看看普通⼈和⾼⼿的回答。
普通人
JVM 就是 Java 虚拟机#xff0c;是⽤来运⾏我们平时所写的 Java 代码的。优点是它会
⾃动进⾏内存管理和垃圾回收#xff0c;缺点是⼀旦发⽣问题#xff0c;要是不了解 JVM 的运⾏
机制#xff0c; 就很难…关于什么是 JVM看看普通⼈和⾼⼿的回答。
普通人
JVM 就是 Java 虚拟机是⽤来运⾏我们平时所写的 Java 代码的。优点是它会
⾃动进⾏内存管理和垃圾回收缺点是⼀旦发⽣问题要是不了解 JVM 的运⾏
机制 就很难排查出问题所在。
高手
JVM 全称是 Java 虚拟机在聊什么是 JVM 之前我们不妨看⼀下这张图。 从这张图中可以看出 JVM 所处的位置同时也能看出它两个作用
l 运⾏并管理 Java 源码⽂件所⽣成的 Class⽂件
l 在不同的操作系统上安装不同的 JVM从⽽实现了跨平台的保证。
⼀般情况下对于开发者⽽⾔即使不熟悉 JVM 的运⾏机制并不影响业务代码的开发因为在安装完 JDK 或者 JRE 之后其中就已经内置了 JVM所以只需要将 Class⽂件交给 JVM 运⾏即可。
但当程序运⾏的过程中出现了问题⽽这个问题发生在 JVM 层⾯的那我们就需要熟悉 JVM 的运⾏机制才能迅速排查并解决 JVM 的性能问题。
我们先看下目前主流的 JVM HotSpot 的架构图通过这张架构图我们可以看出 JVM 的大致流程是把一个 class 文件通过类加载器加载进系统然后放到不同的区域通过编译器编译。 第一个部分 Class Files
在 Java 中Class⽂件是由源码⽂件⽣成的⾄于源码⽂件的内容是每个 Java开发者在 JavaSE 阶段的必备知识这⾥就不再赘述了我们可以关注⼀下 Class⽂件的格式⽐如其中的常量池、成员变量、⽅法等这样就能知道 Java 源码内容在 Class⽂件中的表示⽅式
第二个部分 Class Loader Subsystem 即类加载机制
Class⽂件加载到内存中需要借助 Java 中的类加载机制。类加载机制分为装载、链接和初始化其主要就是对类进⾏查找、验证以及分配相关的内存空间和赋值
第三个部分 Runtime Data Areas 也就是通常所说的运⾏时数据区
其解决的问题就是 Class⽂件进入内存之后该如何进⾏存储不同的数据以及数据该如何进⾏扭转。比如Method Area 通常会储存由 Class⽂件常量池所对应的运⾏时常量池、字段和⽅法的元数据信息、类的模板信息等Heap 是存储各种 Java 中的对象实例Java Threads 通过线程以栈的⽅式运⾏加载各个⽅法Native Internal Thread 可以理解为是加载运⾏native 类型的⽅法PC Register则是保存每个线程执⾏⽅法的实时地址。
这样通过运⾏时数据区的 5 个部分就能很好地把数据存储和运⾏起来了
第四个部分 Garbage Collector 也就是通常所说的垃圾回收
就是对运⾏时数据区中的数据进⾏管理和回收。回收机制可以基于不同的垃圾收集器⽐如 Serial、Parallel、CMS、G1、ZGC 等可以针对不同的业务场景选择不同的收集器只需要通过 JVM 参数设置 即可。如果我们打开 hotspot 的源码可以发现这些收集器其实就是对于不同垃圾收集算法的实现核⼼的算法有3 个标记-清除、标记-整理、复制 标记-清除标记-清除算法即先标记处待回收的垃圾对象然后回收其内存区域。 这种算法存在两个缺点一是这回收过程中需要大量标记清除动作。随着堆中对象数量的增长执行效率越来越低二是会产生内存碎片导致在分配大对象时有可能没有连续的内存提前触发再一次垃圾回收。 标记-整理标记-复制算法在对象存活率较高时就要随之进行更多的复制操作效率也随之降低。同时如果不想浪费一半的内存空间就要提供上述的逃生门机制需要有其他内存空间托底。因此这种算法并不适合对老年代进行回收。 标记-整理算法通常用来回收老年代它的过程是这样的在发生老年代回收时首先标记存活的对象然后将存活对象向内存的一端移动最后清理掉边界以外的内存区域。 标记-复制标记-复制算法即先将堆划分为两个区域新建对象时只使用其中一个区域分配内存发生 GC 时先标记存活的对象然后将存活的对象复制到另一块空间中然后再清空之前的空间。 对象存活的数量较多时需要做大量的复制操作将会产生大量的空间复制开销。但是在对象存活数量较少时只需复制少量的对象然后一次性清理之前使用的空间。在复制时只需按照顺序分配另一块的内存即可不会产生内存碎片问题算法简单高效标记-复制算法特别适合对于年轻代的垃圾回收。 这种算法最大的缺点显而易见分配对象时只使用了一半空间有很严重的空间浪费。 针对这个问题其实可以通过调整前后两块内存空间的占比来优化具体的做法是在 JVM 中将堆的空间主要分为两部分年轻代和老年代同时对于年轻代又划分为 Eden 区域、From 区域和 To 区域。 新建的对象被分配到 Eden Space 中当 Eden 区域空间满时就触发一次 Young GC已经不被使用的做回收处理而仍然被使用的则被复制到 From 区域。经过这个过程整个Eden区域就是空闲的如果有新的对象就 Eden 区域中创建。如果Eden区域的内存再次被用完就再一次触发了 Young GC 这时就将 Eden 区域和 From 区域中还在使用的对象复制到 To 区域。下一次 Young GC 则是将 Eden 区域和 To 区域中还在使用的对象全部复制到 From 区域。 如此经过多次 Young GC 后会存在某些对象在 From 区域和 To 区域进行多次复制如果超过某个阈值对象仍然没有释放则将这些对象复制到 Old Generation。如果Old Generation 区域也用完之后就会触发 Full GC 全量回收会对系统的性能造成非常大的影响所以可以根据各应用的特点和对象的生命周期来设置一个合理的年轻代与老年代的大小值尽量减少 Full GC。 在 HotSpot 虚拟机中默认 Eden 和 Survivor指其中的一块 的大小比例是 8 1即只浪费了 10 % 的空间。当 Survivor 的空间无法存储仍在存活的对象时会有类似逃生门的机制直接进入老年代空间。
第五个部分是 JIT Compiler 和 Interpreter
通俗理解就是翻译器Class 的字节码指令通过 JIT Compiler 和 Interpreter 翻译成对应操作系统的 CPU 指令只不过可以选择解释执⾏或者编译执⾏在HotSpot JVM 默认采用的是这两种⽅式的混合。 第六就是 JNI 的技术
如果我们想要找 Java 中的某个 native⽅法是如何通过 C 或者 C实现的那么可以通过 Native Method Interface 来进⾏查找也就是所谓的 JNI 技术。
通过官⽹上给出的 HotSpot 架构图我们就能够知道 JVM 到底是如何运行的了当然在实际操作的过程中我们可以借助⼀些 JVM 参数 和⼀些常⻅的 JDK 常⻅命令 再结合 JDK 常⻅⼯具以及第三⽅的⼀些⼯具 我们就可以优雅地分析 JVM 出现的常⻅问题并对其进⾏调优。
以上就是我对 JVM 的理解。
好的看完高手的回答后相信每位看完视频的小伙伴对 JVM 有了更深刻的理解了。