简介
JVM(Java虚拟机)是一种虚拟的计算机执行环境,用于执行Java字节码。Java虚拟机不仅仅用于执行Java语言编写的程序,还可以执行其他编译成Java字节码的语言(如Kotlin、Scala等)编写的程序。JVM的主要目标是实现跨平台兼容性,即"一次编写,到处运行"。
功能特点
JVM主要具有以下功能和特点:
1.平台无关性
Java源代码被编译成字节码,而不是直接编译成特定平台的机器代码。JVM负责将字节码转换为特定平台的机器代码并执行。
2.内存管理
JVM负责自动管理程序的内存,包括对象的创建和垃圾回收。这使得Java程序员无需关心内存的分配和释放,从而减少内存泄漏和野指针等问题。
3.加载和链接
JVM在运行时负责加载和链接类文件。类加载器(Class Loader)负责将字节码加载到内存中,并进行验证、准备和解析等过程,最后将类的静态结构转换为运行时数据结构。链接过程包括验证字节码的正确性、为静态变量分配内存并设置初始值等。
4.执行引擎
JVM的执行引擎负责将字节码解释执行或通过即时编译器(JIT)将字节码编译成机器代码再执行。即时编译器可以优化热点代码(经常执行的代码),提高程序的性能。
5.安全性
JVM提供了沙箱(Sandbox)安全模型,限制程序对本地资源的访问,从而保护系统安全。此外,JVM还对字节码进行验证,确保其符合规范并不会损害系统安全。
垃圾回收机制
Java中的垃圾回收(Garbage Collection,GC)机制是JVM(Java虚拟机)的一个重要组成部分,负责自动管理程序的内存。
什么是垃圾
- 垃圾是指在运行程序中没有任何引用指向的对象,这个对象就是需要被回收的垃圾。
- 如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存 溢出。
GC主要目的
- 避免内存泄漏:内存泄漏是指程序在运行过程中动态分配的内存空间没有被及时释放,导致可用内存空间逐渐减少。垃圾回收可以自动检测不再使用的对象,并释放它们占用的内存,从而避免内存泄漏。
- 确保内存的连续性:在程序执行过程中,内存中的对象可能会被移动。垃圾回收可以确保对象在内存中的相对位置不变,从而保持内存的连续性,有利于程序的执行。
- 提高程序的执行效率:通过垃圾回收,程序可以避免因内存不足而导致的频繁的内存分配和释放操作,从而提高程序的执行效率。
java的垃圾回收机制
- 标记(Mark):垃圾回收器首先标记所有需要回收的对象。标记可以分为两种方式:
- 标记-清除(Mark-Sweep):首先标记所有需要回收的对象,然后清除这些被标记的对象。这种策略的缺点是会产生内存碎片。
- 标记-整理(Mark-Compact):在标记-清除的基础上,增加了整理的过程。整理将存活的对象移动到内存的一端,以消除内存碎片。这种策略的缺点是需要移动对象,可能导致额外的开销。
- 清除(Sweep):在标记-清除策略中,清除过程会直接删除被标记的对象。而在标记-整理策略中,清除过程通常是指将存活的对象移动到内存的一端。
- 整理(Compact):在标记-整理策略中,整理过程会将存活的对象移动到内存的一端,以消除内存碎片。这种过程可能会导致对象的相对位置发生变化。
- 复制(Copy):Java的垃圾回收机制通常会将堆内存划分为两个相等的区域,分别用于存储对象的实例和数组。当对象被创建时,它们会被分配到其中一个区域。垃圾回收器可以在进行垃圾回收时,将存活的对象复制到另一个区域,并清空当前区域。这种策略可以有效地避免内存碎片,但需要额外的内存空间。
- 筛选(Filter):在某些垃圾回收策略中,可能会进行筛选的过程。筛选可以将对象分为不同的类别,以便更高效地进行垃圾回收。