虚拟机(一):Java 篇

虚拟机(一):Java 篇

虚拟机(二):Android 篇


架构

运行时数据区:
在这里插入图片描述
栈:
在这里插入图片描述
堆:
在这里插入图片描述

  • 堆:通过new创建的对象都在堆中分配。OutOfMemoryError
    • TLAB(Thread Local Allocation Buffer,线程私有分配缓冲区)
  • 方法区:储了类代码和方法代码。OutOfMemoryError
    • 运行时常量池(Runtime Constant Pool)
  • 虚拟机栈:一个Java程序可能创建了多个线程,每个线程都会有自己的栈。StackOverflowError和OutOfMemoryError
    • 局部变量:方法参数和方法中定义的局部变量
    • 操作数栈:后入先出的栈
    • 动态连接:指向运行时常量池该栈桢所属方法的引用
    • 返回地址:当前方法的返回地址
  • 本地方法栈:本地方法(例如:C/C++语言)执行的区域。StackOverflowError和OutOfMemoryError
  • 程序计数寄存器:存储了执行指令的内存地址。无

判断对象引用

引用计数法:

  • 给对象添加一个引用计数器,每当被引用的时候,计数器的值就加一。引用失效的时候减一,当计数器的值为 0 的时候就表示该对象可以被 GC 回收了。
  • 引用计数无法解决循环引用问题:假设对象A,B都已经被实例化,让A=B,B=A,除此之外这两个对象再无任何引用,此时计数器的值就永远不可能为0,但是引用计数器无法通知gc回收他们

根搜索算法(可达性算法) GC Roots Tracing:

  • 通过一个叫 GC Roots 的对象作为起点,从这些结点开始向下搜索,搜索所走过的路径称为引用链,当一个对象没有与任何的引用链相连的时候则该对象就可以被GC 回收了。
  • 虚拟机中垃圾回收的根对象通常是下面这四种类型的对象
    • 栈中的local变量,即方法中的局部变量
    • 活动的线程(包括主线程和应用程序创建的子线程)
    • static变量
    • JNI中的引用

垃圾收集算法

  • 标记-清除算法:分为标记和清除两个阶段。该算法首先从根集合进行扫描,对存活的对象标记,标记完毕后,再扫描整个空间中未被标记的对象并进行回收。整个过程需要暂停整个程序的全部运行线程,让回收线程以单线程进行工作,过程结束再恢复运行线程。

    1. 效率问题。标记和清除过程的效率都不高。
    2. 空间问题。标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能导致,程序分配较大对象时无法找到足够的连续内存,不得不提前触发另一次垃圾收集动作。
  • 标记-整理算法:标记过程仍然与“标记-清除”算法一样,但不是直接对可回收对象进行清理。该算法在回收期间会同时将保留下来的对象移动聚集到连续的内存空间,从而避免内存空间碎片。但对象的移动是需要时间成本的。

  • 复制算法:

    • 该算法会将所拥有的内存空间分成两个部分。程序运行所需的存储对象先存储在其中一个分区中(例如:定义为“分区0”)。算法执行过程中暂停整个程序的全部运行线程后,进行标记,然后将保留下来的对象移动聚集到另一个分区(例如:定义为“分区1”),这样便完成了回收。在下一次回收时,两个分区的角色对调。很显然,这种算法虽然避免了内存碎片,但对内存空间的使用是比较浪费的,因为始终只能有一半的空间用来使用。
    • 商业的虚拟机都采用复制算法来回收新生代。因为新生代中的对象容易死亡,所以并不需要按照1:1的比例划分内存空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间。每次使用 Eden 和其中的一块 Survivor。当回收时,将 Eden 和 Survivor 中还存活的对象一次性拷贝到另外一块 Survivor 空间上,最后清理掉 Eden 和刚才用过的 Survivor 空间。Hotspot 虚拟机默认 Eden 和 Survivor 的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%(80% + 10%),只有10%的内存是会被“浪费”的。特别地,当survivor1区也不足以存放eden区和survivor0区的存活对象时,就将存活对象直接存放到老年代。如果老年代也满了,就会触发一次FullGC,也就是新生代、老年代都进行回收。注意,新生代发生的GC也叫做MinorGC,MinorGC发生频率比较高,不一定等 Eden区满了才触发
    • “复制”算法在极端的情况下,会出现明显的问题,例如:某些很大的对象,它们的生命周期又很长,那么这些对象便会在分区之间来回移动,这显示是很耗时的。
  • 增量回收:该算法将所拥有的内存空间分成若干分区。程序运行所需的存储对象会分布在这些分区中,每次只对其中一个分区进行回收操作,从而避免程序全部运行线程暂停来进行回收,允许部分线程在不影响回收行为而保持运行,并且降低回收时间,增加程序的响应速度。

  • 分代收集算法

    • 新生代:每次垃圾收集时会有大批对象死去,只有少量存活,所以选择复制算法,只需要少量存活对象的复制成本就可以完成收集。
    • 老年代:对象存活率高、没有额外空间对它进行分配担保,必须使用“标记-清理”或“标记-整理”算法进行回收。
    • 永久代:用于涉及程序整个运行生命周期的对象存储,该空间通常不进行垃圾回收的操作。存储不变的类定义、字节码和常量等。
    • 通过分代,存活在局限域,小容量,寿命短的存储对象会被快速回收;存活在全局域,大容量,寿命长的存储对象就较少被回收行为处理干扰。

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

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

相关文章

无线安灯按钮盒汽车零部件工厂的故障告警与人员调度专家

在汽车零部件制造领域,生产线故障与物料短缺等问题往往引发连锁反应,导致停机损失与成本激增。传统人工巡检与纸质工单模式已难以满足高效生产需求,而无线安灯按钮盒的智能化应用,正成为破解这一难题的关键利器。 一、精准告警&am…

二叉树相关算法实现:判断子树与单值二叉树

目录 一、判断一棵树是否为另一棵树的子树 (一)核心思路 (二)代码实现 (三)注意要点 二、判断一棵树是否为单值二叉树 (一)核心思路 (二)代码实现…

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…

SpringMVC拦截器

SpringMVC拦截器 什么是拦截器拦截器和过滤器的区别SpringMVC 拦截器的工作原理拦截器的配置拦截器的配置主要有两种方式XML 配置方式Java配置方式 创建一个拦截器拦截器的应用场景拦截器的执行顺序 什么是拦截器 SpringMVC 的拦截器(Interceptor)是指在…

cocos creator 笔记-路边花草

版本:3.8.5 实现目标:给3d道路生成路边景观花草 在场景下创建一个节点,我这里种植两种花草模型,兰花和菊花,所以分别在节点下另创建两个节点,为了静态合批。 1.将花草模型分别拖入场景中,制作…

YoloV8训练和平精英人物检测模型

概述 和平精英人物检测,可以识别游戏中所有人物角色,并通过绘制框将人物选中,训练的模型仅仅具有识别功能,可以识别游戏中的视频、图片等文件,搭配Autox.js可以推理,实现实时绘制,但是对手机性…

达梦改密码时不想看到明文

有时,需要修改用户密码 但不想让别人看到你的密码明文 最简单的是用manager工具 找到用户,点击右键,选择modify 这里很明显被掩盖为黑点了,放心输入即可 想通过命令行怎么办? 这不,密码全被看到了 用变…

3. 轴指令(omron 机器自动化控制器)——>MC_GearInPos

机器自动化控制器——第三章 轴指令 17 MC_GearInPos变量▶输入变量▶输出变量▶输入输出变量 功能说明▶时序图▶重启运动指令▶多重启动运动指令▶异常 示例程序▶动作示例▶梯形图▶结构文本(ST) MC_GearInPos 设定主轴和从轴间的齿轮比,进行电子齿轮动作。 指定…

【教学类-58-14】黑白三角拼图12——单页1页图。参考图1页6张(黑白、彩色)、板式(无圆点、黑圆点、白圆点)、宫格2-10、张数6张,适合集体操作)

背景需求: 基于以下两个代码,设计一个单页1页黑白三角、彩色三角(包含黑点、白点、无点)的代码。 【教学类-58-12】黑白三角拼图10(N张参考图1张操作卡多张彩色白块,适合个别化)-CSDN博客文章…

pytest-xdist 进行高效并行自动化测试

pytest-xdist 的核心功能是通过多进程分发测试任务,每个进程独立运行测试,确保测试隔离。2025 年 3 月 25 日,pytest-xdist 在 GitHub 上已有超过 1,200,000 次下载,表明其在测试社区中的广泛接受。 在自动化测试中,随…

18502 字符串哈希匹配字符串

18502 字符串哈希匹配字符串 ⭐️难度:中等 🌟考点:字符串hash 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int…

通过git文件查看大模型下载链接的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

Linux设备永久挂载

一、fstab文件详解 下面是我虚拟机中的一个fstab文件,可以看到有四行配置,每一行有6个字段,下面我会对字段的含义进行讲解。 /etc/fstab 文件包含了如下字段,通过空格或Tab分隔: file systems:要挂载的分区或存储设备;dir:挂载位置;type:要挂载设备或分区的文件系统…

Linux系统初始化脚本

Rocky、Almalinux、CentOS、Ubuntu、Debian、openEuler、AnolisOS、OpenCloudOS、openSUSE、银河麒麟(Kylin Server)和统信(Uos Server)系统初始化脚本 Shell脚本源码地址: Gitee:https://gitee.com/raymo…

多智能体融合(Multi-Agent Fusion)

多智能体融合(Multi-Agent Fusion)是指在多智能体系统(MAS, Multi-Agent System)中,多个智能体(Agent)通过协作、竞争或共享信息,实现全局最优的智能决策和任务执行。该方法广泛应用…

[ ] 前后端连接 结合常见故障场景和解决

调试流程图: 一、基础网络检查 IP与端口验证 确认前端请求的URL与后端实际运行的IP和端口完全一致(如http://192.168.1.100:8080/api)使用ping命令测试网络连通性,telnet检查端口是否开放: telnet 192.168.1.100 80…

EMC知识学习一

一、概念 EMC电磁兼容:Electromagnetic Compatibility,包括两个方面:EMI:electromagnetic interference电磁干扰,指在设备正常运行过程中对所在环境产生的干扰不能超过一定的限值,EMS:电磁耐受性…

学有所记——初探向量数据库Weaviate

目标: 了解向量数据库的连接、建库、插入数据、查询数据等基本用法以及关于语义相似度的一些基本概念。 背景: 前段时间尝试在自己的电脑上搭建OllamaDify平台,体验并探索大模型的强大功能。在使用过程中,尤其是在搭建RAG知识库…

uv包简单使用案例

uv由Charlie Marsh开发,是Astral Tool的一个快速Python包安装器和解析器。它类似于pip和pip-tools,但速度更快。此外,uv还支持虚拟环境管理,替代venv和virtualenv。 参考:https://github.com/astral-sh/uv 安装&#x…

34.[前端开发-JavaScript基础]Day11-王者轮播图-书籍购物车-BOM对象-JSON

1 认识BOM操作 认识BOM 2 全局对象window window对象 window对象的作用 window常见的属性 window常见的方法 3 事件对象event window常见的事件 4 location、history location对象常见的属性 Location对象常见的方法 URLSearchParams history对象常见属性和方法 5 navigato…