本文介绍: 如果Old Generation 区域也用完之后,就会触发 Full GC ,全量回收会对系统性能造成非常大的影响,所以可以根据各应用的特点和对象生命周期设置一个合理的年轻代与老年代大小值,尽量减少 Full GC。在 Java 中,Class⽂件是由源码⽂件⽣成的,⾄于源码⽂件的内容,是每个 Java开发者在 JavaSE 阶段的必备知识,这⾥就不再赘述了,我们可以关注⼀下 Class⽂件的格式,⽐如其中的常量池、成员变量、⽅法等,这样就能知道 Java 源码内容在 Class⽂件中的表示⽅式。

关于什么是 JVM,看看普通⼈和⾼⼿的回答。

普通人

JVM 就是 Java 虚拟机,是⽤来运⾏我们平时所写的 Java 代码的。优点是它会

⾃动进⾏内存管理垃圾回收,缺点是⼀旦发⽣问题,要是不了解 JVM 的运⾏

机制, 就很难排查问题所在

高手

JVM 全称是 Java 虚拟机,在聊什么是 JVM 之前,我们不妨看⼀下这张图。

image-20231129202929721

从这张图中可以看出 JVM 所处的位置,同时也能看出它两个作用

l 运⾏并管理 Java 源码⽂件所⽣成的 Class⽂件,

l 在不同操作系统安装不同的 JVM,从⽽实现跨平台的保证。

⼀般情况下,对于开发者⽽⾔,即使不熟悉 JVM 的运⾏机制并不影响业务代码开发,因为在安装完 JDK 或者 JRE 之后,其中就已经内置了 JVM,所以只需要将 Class⽂件交给 JVM 运⾏即可

但当程序运⾏的过程出现问题,⽽这个问题发生在 JVM 层⾯的,那我们就需要熟悉 JVM 的运⾏机制,才能迅速排查解决 JVM 的性能问题

我们先看下目前主流的 JVM HotSpot架构图通过这张架构图,我们可以看出 JVM 的大致流程是把一个 class 文件通过加载加载系统然后放到不同区域通过编译器编译

image-20231129203101403

第一个部分 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 个:标记清除标记整理复制

第五个部分是 JIT Compiler 和 Interpreter

通俗理解就是翻译器,Class字节指令通过 JIT Compiler 和 Interpreter 翻译对应操作系统的 CPU 指令,只不过可以选择解释执⾏或者编译执⾏,在HotSpot JVM 默认采用的是这两种⽅式的混合。

image-20231129203351511

第六就是 JNI 的技术

如果我们想要找 Java 中的某个 native⽅法是如何通过 C 或者 C++实现的,那么可以通过 Native Method Interface 来进⾏查找,也就是所谓的 JNI 技术

通过官⽹上给出的 HotSpot 架构图,我们就能够知道 JVM 到底是如何运行的了,当然在实际操作过程中我们可以借助⼀些 JVM 参数

image-20231129203511665

和⼀些常⻅的 JDK 常⻅命令

image-20231129203543082

结合 JDK 常⻅⼯具以及第三⽅的⼀些⼯具

image-20231129203609897

我们就可以优雅地分析 JVM 出现的常⻅问题并对其进⾏调优

以上就是我对 JVM 的理解

好的,看完高手的回答后,相信每位看完视频小伙伴对 JVM 有了更深刻的理解了。

原文地址:https://blog.csdn.net/qq_24428851/article/details/134699169

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_34876.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注