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):在某些垃圾回收策略中,可能会进行筛选的过程。筛选可以将对象分为不同的类别,以便更高效地进行垃圾回收。
相关推荐
这周也會开心几秒前
云服务器安装JDK、Tomcat、MySQL
java·服务器·tomcat
hrrrrb1 小时前
【Spring Security】Spring Security 概念
java·数据库·spring
小信丶1 小时前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
sdgsdgdsgc1 小时前
Next.js企业级应用开发:SSR、ISR与性能监控方案
开发语言·前端·javascript
周杰伦_Jay2 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
星梦清河2 小时前
宋红康 JVM 笔记 Day18|class文件结构
jvm
晓风残月淡2 小时前
JVM字节码与类的加载(二):类加载器
jvm·python·php
用手手打人2 小时前
JVM(十)-- 类的加载器
jvm
rit84324995 小时前
基于MATLAB的模糊图像复原
开发语言·matlab
fie88895 小时前
基于MATLAB的声呐图像特征提取与显示
开发语言·人工智能