学Java的你,还不知道什么是Java虚拟机(JVM)吗?

createh51个月前 (02-01)技术教程21

“这里是云端源想IT,帮你轻松学IT”

嗨~ 今天的你过得还好吗?

今天是五四青年节

愿你历经千帆

归来仍是少年

- 2023.05.04 -

大家好!大家的五一过得怎么样?假期过完了,我们学习Java的计划也该提上日程,今天给大家分享的内容是Java虚拟机也就是常说的JVM的相关内容,让我们更清楚地了解JVM的概念和作用。


一、什么是Java虚拟机(JVM)

1.概念

虚拟机是一种抽象化的计算机,可以通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如堆栈、处理器、寄存器等,还具有许多相应的指令系统。

Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

2.JVM的作用及特点

  • 跨平台和内存管理
  • System.out.println();向系统控制台输出内容
  • JVM负责向windows和Linux 调用底层函数才能实现输出。
  • 与平台的无关性
  • Java虚拟机是Java语言底层实现的基础。

3.JVM跨平台流程图

注意:像Java跨平台主要靠JVM来实现的,JVM 与Java应用程序是1:1。

了解了什么是JVM后,我们再来看看虚拟机的垃圾回收机制以及在实际Java开发过程中怎样优化代码能够让我们垃圾回收机制运行的更加流畅高效。


二、虚拟机垃圾回收机制与代码优化

1.什么是垃圾回收机制

垃圾回收器可以比喻为“伟大的环卫工人”。垃圾收集GC(Garbage Collection)是Java语言的核心技术之一, 在Java中,程序员不需要去关心内存动态分配和垃圾回收的问题,这一切都交给了JVM来处理。

2.在Java代码中如何发现垃圾

对于Java对象来说,如果这个对象没有被其他对象所引用该对象就是无用的,或者说 没有被方法区和栈帧引用和本地方法栈使用的都是垃圾,其占用的内存也就要被销毁。

Java中标记垃圾的算法主要有两种,引用计数法和根搜索算法:

(1)使用引用计数法

引用计数法就是给对象中添加一个引用计数器,每当有一个地方需要引用它,计数器就加 1。当引用失效,计数器就减 1。任何时候计数器为 0 的对象就是不可能再被使用的,可以当做垃圾收集。

这种方法实现起来很简单而且优缺点都很明显。

  • 优点 :执行效率高,程序执行受影响较小
  • 缺点:无法检测出循环引用的情况,导致内存泄露

(2)使用根搜索计算法

这个算法就是通过一系列称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。

3.如何将垃圾回收

在Java中存在着四种垃圾回收算法,标记清除算法、复制算法、标记整理算法以及分代回收算法。

标记清除法: 标记出所有需要被回收的对象,清除回收被标记的对象所占用的空间。它的缺点在于:存在内存碎片,内存利用率不高。

分段复制法: 将内存分为大小相同的两块,每次使用其中的一块。当第一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。它的缺点在于:大量的对象移动,会导致JVM卡顿。

标记整理算法:该算法标记阶段和标记清除一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。这个是为了解决复制算法的缺陷,碎片少,充分利用内存空间。

分代收集算法: 根据具体的情况选择具体的垃圾回收算法。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。当前虚拟机的垃圾收集都采用分代收集算法,因为它的效率更高。

这四种垃圾回收算法你都记住了吗?没记住也没关系,收藏起来,或者手动摘抄到自己的Java学习笔记中,需要用的时候随时翻开看看,遇到问题就不慌啦。最后再来看下Java类加载器是什么?它的作用又是什么?


三、什么是类加载器?

Java类加载器是Java运行时环境的一部分,负责动态加载Java类到Java虚拟机的内存空间中。类通常是按需加载,即第一次使用该类时才加载。由于有了类加载器,Java运行时系统不需要知道文件与文件系统。

1.类加载器的分工

2.类加载器是用来做什么的

  • 类加载器是在虚拟机中完成的,负责动态加载Java类到Java虚拟机的内存空间中,在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。
  • 类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例。

3.类加载器四种类型

启动类加载器,没有父类。

拓展类加载器,由Java语言实现,父类加载器为null。

系统类加载器,由Java语言实现。

自定义类加载器,父类加载器肯定为AppClassLoader。

看完这篇文章你对什么Java虚拟机(JVM)了解清楚了吗,JVM是Java技术的重中之重,学习Java一定要对它有一个深入的了解哦。

今天的分享就到这里了,记得点赞和收藏!


我们下期再见!


END

文案编辑|云端学长

文案配图|云端学长

内容由:云端源想分享


相关文章

Java的jvm你应该知道的(jvm有什么)

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。 由于Java的跨平台性,经过编...

Java虚拟机(jvm)-简介(深入浅出:java虚拟机设计与实现)

一、Java运行时虚拟机内存区域划分1.元空间(Metaspace)元空间(Metaspace)从java8开始替换掉了原来的方法区(Method Area)。相比方法区(Method Area)在元...

Java 动态调试技术原理及实践(java的动态性指的是什么)

调试是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。最常用的断点调试技术会在断点位置停顿,导致应用停止响应。本文将介绍一种Java动态调试技术,希望能对大家有帮助。同时也欢迎读者朋友们一起交...

教你用Java开发一个简单的JVM(java开发实例教程)

一、前言几年前,接到一个开发任务:用Java开发能运行Java智能合约的虚拟机。在开发Java智能合约时,只能使用智能合约SDK提供的类和一些Java常用类(8种基本数据类型包装类;String、Bi...

JVM之Java编译到执行(1)——引(运行java编译器的命令)

Java语言特点一次编写,到处运行。也就是跨平台。 因为这个跨平台的实现原理,而导致Java的编译流程,与以往的C++之类语言有不同。各个操作系统的底层实现,资源的协调,和硬件操作各有各的不同。就意味...

JAVA面试题每日一练:描述一下JVM加载class文件的原理机制?

Java是一门高度平台独立的编程语言,但在这个跨平台的特性背后,Java虚拟机(JVM)却承担了一个至关重要的任务:类加载。类加载不仅是Java程序执行的前提,它还是保证Java平台安全性和可扩展性的...