JVM(Java虚拟机)功能特点、垃圾回收机制

简介

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主要目的

  1. 避免内存泄漏:内存泄漏是指程序在运行过程中动态分配的内存空间没有被及时释放,导致可用内存空间逐渐减少。垃圾回收可以自动检测不再使用的对象,并释放它们占用的内存,从而避免内存泄漏。
  2. 确保内存的连续性:在程序执行过程中,内存中的对象可能会被移动。垃圾回收可以确保对象在内存中的相对位置不变,从而保持内存的连续性,有利于程序的执行。
  3. 提高程序的执行效率:通过垃圾回收,程序可以避免因内存不足而导致的频繁的内存分配和释放操作,从而提高程序的执行效率。

java的垃圾回收机制

  1. 标记(Mark):垃圾回收器首先标记所有需要回收的对象。标记可以分为两种方式:
    1. 标记-清除(Mark-Sweep):首先标记所有需要回收的对象,然后清除这些被标记的对象。这种策略的缺点是会产生内存碎片。
    2. 标记-整理(Mark-Compact):在标记-清除的基础上,增加了整理的过程。整理将存活的对象移动到内存的一端,以消除内存碎片。这种策略的缺点是需要移动对象,可能导致额外的开销。
  2. 清除(Sweep):在标记-清除策略中,清除过程会直接删除被标记的对象。而在标记-整理策略中,清除过程通常是指将存活的对象移动到内存的一端。
  3. 整理(Compact):在标记-整理策略中,整理过程会将存活的对象移动到内存的一端,以消除内存碎片。这种过程可能会导致对象的相对位置发生变化。
  4. 复制(Copy):Java的垃圾回收机制通常会将堆内存划分为两个相等的区域,分别用于存储对象的实例和数组。当对象被创建时,它们会被分配到其中一个区域。垃圾回收器可以在进行垃圾回收时,将存活的对象复制到另一个区域,并清空当前区域。这种策略可以有效地避免内存碎片,但需要额外的内存空间。
  5. 筛选(Filter):在某些垃圾回收策略中,可能会进行筛选的过程。筛选可以将对象分为不同的类别,以便更高效地进行垃圾回收。
相关推荐
不是二师兄的八戒9 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
小牛itbull9 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i18 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落21 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
爱编程的小生21 分钟前
Easyexcel(2-文件读取)
java·excel
GIS瞧葩菜30 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198734 分钟前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰38 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis