虚拟机(一):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.mzph.cn/diannao/76123.shtml

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

相关文章

硬件基础--14_电功率

电功率 电功率:指电流在单位时间内做的功(表示用电器消耗电能快慢的一个物理量)。 单位:瓦特(W),简称瓦。 公式:PUI(U为电压,单位为V,i为电流,单位为A,P为电功率,单位为W)。 单位换算:进位为1000&#xff…

更高的效率——MyBatis-plus

一、什么是MyBatis-plus? MyBatis-plus是MyBatis的增强工具,在MyBatis基础上只做增强不做改变,可以简化基础的CRUD操作(通过继承 BaseMapper 接口可直接使用预定义的增删改查方法) 二、MyBatis-plus快速入门 2.1 准备…

【算法基础】递归与递推

目录 递归实现指数型枚举 题目 算法解析 递归实现排列型枚举 题目 算法解析 费解的开关 题目 算法解析 递归实现组合型枚举 题目 算法解析 带分数 题目 算法解析 飞行员兄弟 题目 算法解析 翻硬币 题目 算法解析 递归实现指数型枚举 题目 算法…

Java 大视界 -- Java 大数据在智慧矿山设备故障预测与预防性维护中的技术实现(163)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

综合实验一

实验拓扑图: 实验要求: 1,内网IP地址使用172.16.0.0/16分配 2,SW1和SW2之间互为备份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问ISP路由器环回 实验步骤: 步骤1&…

snort检测端口扫描工具

前面两篇文章介绍了snort3相关知识和Ubuntu上的安装配置Ubuntu22.04上Snort3的安装与基本配置 -CSDN博客 和Snort规则定义并进行的简单的测试Snort规则定义与测试 -CSDN博客,接下来我将介绍如何编写一个简单的检测端口扫描的规则进行检测 一、实验环境 攻击机&…

【行测】资料分析

> 作者:დ旧言~ > 座右铭:读不在三更五鼓,功只怕一曝十寒。 > 目标:掌握 资料分析 基本题型,并能运用到例题中。 > 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! …

工地扬尘监测仪:守护蓝天白云的重要工具

在城市化进程加速推进的背景下,建筑工地数量呈现持续增长态势,扬尘污染问题亦愈发显著。扬尘不仅对空气质量造成负面影响,更对周边居民的健康状况及生活质量构成威胁。在此情形下,工地扬尘监测仪作为建筑工地环境管理中不可或缺的…

Windows10 下QT社区版的安装记录

0. 介绍 踩了一些坑,记录一下,主要是镜像源的问题。 1. 安装 首先你先要在qt官网上有一个自己的账号。 然后点右上角的下载 打开后,我们需要选择社区版本;如果选择直接下载的话,出来的就是商业版本。 点开后&…

自定义一个C语言字符串取整函数

一、字符串取整的主要思路 1、遍历每个字符; 2、获得0到9的字符对应的整数值; 3、把对应位置的十进制权重相乘; 4、把所有的相乘结果相加; 5、返回相加结果; 二、主要代码 // 主要是把十进制的整数字符转成十进制变量值…

VS Code C/C++项目设置launch.json中的environment参数解决支持库路径问题

问题描述 Windows 11 VS Code C/C 开发环境搭建分别写了c和cpp两个示例代码,在运行过程中c代码没有发现问题(可能简单,没有用到太多支持),但使用了stl的cpp代码并没有运行出来,如下图: 出问题…

C语言pthread库的互斥锁使用案例

一、函数约定 1、初始化锁 int pthread_mutex_init(pthread_mutex_t* m, const pthread_mutexattr_t* attr) 2、加锁 int pthread_mutex_lock(pthread_mutex_t* m); 3、解锁 int pthread_mutex_unlock(pthread_mutex_t* m); 4、销毁 int pthread_mutex_de…

随机2级域名引导页HTML源码

源码介绍 随机2级域名引导页HTML源码,每次点进去都随机一个域名前缀。 修改跳转域名在 350 行代码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行 效果预览 源码免费获取 随机2级域名引导页…

NQA 网络质量分析协议

协议信息 网络质量分析协议,支持 icmp 等协议测试 配置实现 华为 创建 ICMP 测试实例 NQA 与静态路由联动 ​ip route-static 10.1.1.0 24 10.1.2.1 track nqa admin test1​​

Nginx — nginx.pid打开失败及失效的解决方案

1、场景一:nginx.pid文件或者目录不存在 1.1、报错详情 [rootmaster conf]# ../sbin/nginx -s reload nginx: [error] open() "/var/run/nginx/nginx.pid" failed (2: No such file or directory) #nginx.pid文件或目录不存在。 原因: 1、文件…

Gitee批量删除仓库

Gitee批量删除仓库 文章目录 Gitee批量删除仓库生成一个GiteeToken通过Python调用Gitee API参考文档 生成一个GiteeToken 右上角下拉->设置->安全设置->私人令牌->生成新令牌,注意将令牌保存(只会出现一次) 通过Python调用Gite…

AireOS WLC安装License报错

1.概述 本文主要记录在AireOS的WLC上安装License错误的情况。License的类型也是传统的License,因为设备的型号已经EOL,相关的资料应该较少,这里进行可能问题的记录。 2.适用场景 型号:WLC2500,WLC5508 License类型…

利用 Excel 函数随机抽取(附示例)

RANDARRAY 是 Excel 365 和 Excel 2021 引入的一个函数,用于生成一个随机数数组。它的语法如下: RANDARRAY([rows], [columns], [min], [max], [whole_number])参数详解 rows(可选) 要生成的行数(默认值为 1&#xff…

Python:爬虫概念与分类

网络请求: https://www.baidu.com url——统一资源定位符 请求过程: 客户端,指web浏览器向服务器发送请求 请求:请求网址(request url);请求方法(request methods);请求头(request header)&…

【今日半导体行业分析】2025年3月30日

今日探针卡行业分析:把握机遇,应对挑战 一、引言 在半导体产业的精密制造流程中,探针卡作为晶圆测试环节的核心设备,犹如一颗精密的 “心脏”,承担着芯片封装前电学性能测试与筛选的重任。其性能的优劣直接关系到芯片…