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):在某些垃圾回收策略中,可能会进行筛选的过程。筛选可以将对象分为不同的类别,以便更高效地进行垃圾回收。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

润申信息企业标准化管理系统 AddNewsHandler.ashx 任意用户创建漏洞复现

0x01 产品简介 润申信息科技企业标准化管理系统通过给客户提供各种灵活的标准法规信息化管理解决方案,帮助他们实现了高效的标准法规管理,完成个性化标准法规库的信息化建设。 0x02 漏洞概述 润申信息企业标准化管理系统 AddNewsHandler.ashx 接口处存在任意用户创建漏洞,…

web前端代码指南(vue3)

一、命名规范 市面上常用的命名规范: camelCase(小驼峰式命名法 —— 首字母小写)PascalCase(大驼峰式命名法 —— 首字母大写)kebab-case(短横线连接式)Snake(下划线连接式&#…

Linux安装部署Tomcat

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Linux安装部署Tomcat //将tomcat压缩包解压到对…

python识别电脑是windows还是linux

代码实现 import osif os.name nt:print(当前操作系统是 Windows) elif os.name posix:print(当前操作系统是 Linux 或 Unix 类型的系统) else:print(未知的操作系统)

vue 3 + TS 组合式标注类型

1.组件的 emits 标注类型 <script setup lang"ts"> // 运行时 const emit defineEmits([change, update])// 基于选项 const emit defineEmits({change: (id: number) > {// 返回 true 或 false// 表明验证通过或失败},update: (value: string) > {//…

XiaodiSec day015 Learn Note 小迪安全学习笔记

XiaodiSec day015 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day15 还是基础的Php开发 看来是比较基础的 主题&#xff1a;登录验证 COOKIE & SESSION 后台系统有多个验证 为了方便验证使用cookie或session 类似于用户状态管理? cookie存储…

kubernetes中的副本控制器rc(replicationcontrollers)和rs(replicasets)

一、rc控制器replicationcontrollers rc控制器就是控制相同pod副本数量 使用rc控制器资源创建pod&#xff0c;设定创建pod资源的数量 1.1 案例 1.1.1、创建资源清单 [rootmaster rc-demo]# cat rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: rc01 …

代码随想录打卡—day28—【回溯】— 回溯基础练习 4.17+4.19

1 93. 复原 IP 地址 也是类似前一天的分割回文串。可以用我的字符之间0101的思路&#xff0c;也可以直接用[start_idx,i]选取子串的方法&#xff0c;选取后者&#xff0c;代码简洁一点&#xff1a; class Solution { public:vector<string> ans;string path;void dfs(i…

【Ansible】04

【Ansible】03 任务块 block任务块 使用 block 可以将多个任务合并为一个组可以将整个 block任务组 , 一起控制是否要执行 # 如果webservers组中的主机系统发行版是Rocky&#xff0c;则安装并启动nginx [rootpubserver ansible]# vim block1.yml --- - name: block tasksho…

个人搭建alist网盘的经验记录备忘

1、搭建宝塔LINUX面板&#xff0c;安装Docker 2、添加仓库 3、从镜像拉取xhofe/alist:latest 4、添加容器 5、新建一个网站&#xff0c;别忘记申请个SSL证书&#xff0c;重要的是反向代理 6、新建个mysql数据库 7、修改alist数据库的链接地址&#xff0c;方便自己备份&a…

如何有效地进行汽车制造业文件共享,一文了解

随着数字化转变&#xff0c;企业的业务文件大多通过电子形式在内外部流转。这增加了外发文件数据泄露或被篡改的风险&#xff0c;如何保护外发文件安全已成为企业不容忽视的课题。其中汽车制造业是一个高度依赖文件共享与协作的行业&#xff0c;涉及设计图纸、技术文件、供应链…

Docker命令总结

一.Docker常用命令总结 1.镜像命令管理 指令描述ls列出镜像build构建镜像来自Dockerfilehistory查看历史镜像inspect显示一个或多个镜像的详细信息pull从镜像仓库拉取镜像push推送一个镜像到仓库rm移除一个或多个镜像prune一处未使用的的镜像&#xff0c;没有被标记或被任何容…

【用户投稿】Apache SeaTunnel 2.3.3+Web 1.0.0版本安装部署

项目概要 Apache SeaTunnel 是一个分布式、高性能、易扩展的数据集成平台&#xff0c;用于实时和离线数据处理,支持多种数据源之间的数据迁移和转换。 其中&#xff0c;Apache-seatunnel-web-1.0.0-bin.tar.gz和apache-seatunnel-2.3.3-bin.tar.gz代表了 Apache SeaTunnel Web…

RTT学习 开发环境搭建

添加文件到工程 BSP下的applications文件夹用于存放用户自己的应用代码&#xff0c;目前只有一个main.c文件&#xff0c;如果用户的应用代码不是很多&#xff0c;建议相关源文件都放在这个文件夹下面&#xff0c;在applications文件夹下新增两个简单的文件hello.c和hello.h。 …

什么是正向代理和反向代理

正向代理和反向代理是两种不同的代理服务器配置方式&#xff0c;它们在代理的方向和作用上有所不同。 一、正向代理&#xff08;Forward Proxy&#xff09; 代表客户端发送请求到其他服务器的代理服务器。客户端将请求发送给正向代理服务器&#xff0c;然后由正向代理服务器代…

如何使用OSI七层模型的思路进行Linux网络问题排障?

在运维工作中&#xff0c;我们可能经常遇到诸如服务器无法远程连接、网站无法访问等各种网络问题。此时你是否想过&#xff0c;我们常背的OSI七层模型&#xff0c;能在处理这样的实际问题中发挥什么样的作用呢&#xff1f; 基于OSI架构的方法论&#xff0c;我们可以使用自下而…

ATFX汇市:欧元区和美国的制造业PMI将发布,市场预期乐观

ATFX汇市&#xff1a;今日16:00&#xff0c;市场研究机构Markit将发布欧元区4月制造业PMI初值&#xff0c;前值为46.1&#xff0c;预期值46.6&#xff0c;预期将增加0.5个百分点。历史数据看&#xff0c;最近三个月&#xff0c;欧元区的制造业PMI均处于较高水平&#xff0c;期间…

Springboot+Vue项目-基于Java+MySQL的房屋租赁系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

从0到1带你玩转pandas

学习 pandas 的过程可以分为几个阶段&#xff0c;每个阶段都围绕着不同的核心技能和概念。下面是一个为初学者设计的学习大纲&#xff1a; 一. 基础介绍 学习如何安装和设置 pandas 以及了解它的基本概念是开始使用 pandas 进行数据分析的第一步。下面我将详细介绍这些步骤&am…