Java虚拟机 - JVM(类加载器、类加载的过程、双亲委派模型、GC垃圾回收)

news2024/11/8 21:34:31

一、JVM中数据内存区域划分

本地方法栈:里面保存的是native 关键字的方法,不是用Java写的,而是jvm内部用c++实现的。

**程序计数器 和 虚拟机栈 每个线程都存在一份

        如果一个 JVM 进程 中有 10个 线程,那么就会存在 10份 程序计数器 和 虚拟机栈。

**堆区 和 元数据区 是整个进程 独一份的!!!

所以有这样的说法 : 在jvm里,每个线程都有自己私有的栈空间

例如:

二、 类加载

1.类加载的基本流程

1)加载:找到.class文件,打开文件,读取文件内容

2)验证:类文件结构

在Java SE 官方标准文档中,记录了 ClassFile 文件结构的细节

Chapter 4. The class File Format

3)准备:给类对象分配内存空间(最终目的 构造类对象)

4)解析:针对类对象中的字符串常量进行处理

字符串常量 在被创建的时候,初始化语句先被设置成一个 “文件的偏移量”,通过这个偏移量,就能找到这个字符串常量 的 位置了。

当这个类真正被加载到内存中的时候,再把这个偏移量,替换回真正的地址

5)初始化:针对类对象进行初始化

       

2.双亲委派模型

类加载过程中,找 .class文件的过程

双亲委派模型,可以看成一个简单的 查找优先级 的问题

优先级 :bootstrap classloader  > extension classloader > application classloader

双亲委派模型 并不是不能打破的。

三、GC垃圾回收

在c++中,delete 存在执行不到的情况,就可能存在内存泄漏

GC垃圾回收的步骤

1.找到垃圾

        垃圾:不在使用的对象

GC圈中主流的两个方案:

1)引用计数【python 、php】

当引用计数为 0 ,此时代码中就不能访问到这个对象了

此时这个对象就可以视为垃圾了

***为什么Java不用这个方案??


**1浪费内存

每个对象单独开一块空间,保存对应的对象的引用个数。

一个计数器,少说2个字节

        如果对象为 2个字节,计数器占 2/2+2(50%)的空间;

        如果对象为 4个字节,计数器占2/2+4 (33%)的空间;

当 对象数量很少 或者 对象空间比较大 的时候,影响不大

当 对象空间小(例如对象本身2个字节,计数器2个字节,就浪费了50%),数量还多(n个50%的空间浪费),计数器所占空间就难以忽略

**2存在 “ 引用循环 ” 的问题

此时,第一个对象 引用了 第二个对象。

           第二个对象 引用了 第一个对象。

要想使用第一个对象,就要拿到第二个对象。

要想拿到第二个对象,就要先拿到第一个对象。这样就有了一个逻辑上的死循环。

类似于 家钥匙锁车里了,车钥匙锁家里了

2)可达性分析【Java】

可达性分析,本质上是 时间换空间 的手段。

用一个或多个线程,周期性的扫描我们代码中的对象。
从一些特定的对象出发,尽可能的进行访问遍历。把所有能访问到的对象,都标记成可达。反之,经过扫描后,未被标记的对象,就是“垃圾”了。

例如:

***可达情况:

***不可达情况:

***可达性分析是周期性的,可能某个对象上一秒还不是垃圾,下一秒就是垃圾了

2.释放垃圾

三种回收垃圾的基本思路

1)标记清除(简单粗暴)
缺陷:产生大量内存碎片

假设这里有四个对象,2和4被标记为垃圾,要清除。

2)复制算法
通过复制的方法,把有效的对象复制到一起。再统一释放剩余空间
优势:避免了内存碎片
缺点
1.内存要浪费一半,利用率不高
2.如果有效对象特别多,拷贝开销就很会很大

假设这里有五个对象,其中1 3 5是垃圾,有效数据是 2 4.

把有效数据,复制到一边

再把原来的数据全部释放

3)标记整理 
优势:既能解决 内存碎片问题,又能 处理复制算法中的利用率
缺点:搬运的开销仍然很大

假设 1 3 5 是 垃圾,2 4 6 为有效对象

把有效的对象搬运到前面

再把剩余的删除

3.JVM 中的释放垃圾

实际上,JVM中的 释放垃圾思路,是上述三种方案的结合体

        通过 新生代 老年代 相结合的方式,分代回收这样的思想,来释放垃圾。实际上JVM垃圾回收器具体实现的时候,会有一些优化和调整。
新生代 主要使用 复制算法
老年代 主要使用 标记整理算法

(标记算法并没有真正使用到)

能活过的GC扫描次数越多的对象,会放在 老年代

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

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

相关文章

通过文本指令生成3D模型纹理贴图

在3D建模的广阔领域中,我们总是追求更高效、更直观的方法来创建和编辑模型。今天,我要向大家介绍一种革新性的技术,它能够通过文本指令来精确地控制3D模型的细节,包括纹理贴图的生成。 1. 技术定位 这项技术主要定位于交互式3D建模领域,它为用户提供了一种全新的方式来创…

哈喽GPT-4o——对GPT-4o Prompt的思考与看法

目录 一、提示词二、提示词的优势1、提升理解能力2、增强专注力3、提高效率 三、什么样的算无效提示词?1、过于宽泛2、含糊不清3、太过复杂4、没有具体上下文5、缺乏明确目标6、过于开放7、使用专业术语但未定义8、缺乏相关性: 四、提示词正确的编写步骤…

Android 应用加固与重签名—使用AndroidStudio自带工具 apksigner

由 AndroidStudio 生成的release版本的app有自己的签名,但当应用加固后会删除原签名,需要重新签名。 一、加固方式: 使用基础版的腾讯云(乐固)进行免费加固,上传软件后等待在线加固完成后下载 apk 即可。…

设置SSHkeys多服务器免登录配置(ssh config)

一、背景: 多邮箱或者多git账号进行同一台电脑开发的情况。 有时候,开发时可能会面临一个情况,就是通过自己的电脑,可能同时需要开发多个不同地方的项目,或者说,自己建立的项目已经配置好SSH验证免密登录&a…

Qt C++ TCP服务端响应多客户端通讯

本示例使用的设备&#xff1a;WIFI无线4G网络RFID云读卡器远程网络开关物流网阅读器TTS语音-淘宝网 (taobao.com) #include "mainwindow.h" #include "ui_mainwindow.h" #include "QMessageBox" #include <QDebug> #include <exceptio…

【春秋云镜】Faculty Evaluation System未授权任意文件上传漏洞(CVE-2023-33440)

因为该靶场没有Write up,索性自己搞一下&#xff0c;方便别人&#xff0c;快乐自己&#xff01; 漏洞概述&#xff1a; Sourcecodester Faculty Evaluation System v1.0 is vulnerable to arbitrary code execution via /eval/ajax.php?actionsave_user. 漏洞复现&#xff…

Halcon 多相机统一坐标系

小杨说事-基于Halcon的多相机坐标系统一原理个人理解_多相机标定统一坐标系-CSDN博客 一、概述 最近在搞多相机标定等的相关问题&#xff0c;对于很大的场景&#xff0c;单个相机的视野是不够的&#xff0c;就必须要统一到一个坐标系下&#xff0c;因此我也用了4个相机&#…

SpringBoot Vue Bootstrap 旅游管理系统

SpringBoot Vue 旅游管理系统源码&#xff0c;附带环境安装&#xff0c;运行说明 源码地址 开发环境 jdk1.8,mysql8,nodejs16,navicat,idea 使用技术springboot mybatis vue bootstrap 部分功能截图预览

数据合规怎么做?哪些机构可以做数据合规

企业将数据资源入表的工作是一项复杂而全面的任务 财务部门负责统计数据资源的成本、销售数据等信息,并确保数据资源的会计处理符合会计要求&#xff1b; 数据部门则负责统计数据成本来源、价值实现路径等信息&#xff1b; 法务部门需要确认数据的收集和使用遵循相关的合规要求…

算法分析与设计期末考试复习

重点内容&#xff1a; 绪论&#xff1a; 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法&#xff1a; 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法&#xff08;快速幂&#xff09; 分治法解决平面最近点对问…

基于遗传优化算法的风力机位置布局matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化算法的风力机位置布局matlab仿真&#xff0c;风力机位置布局优化是风能转换系统设计中的一个重要环节&#xff0c;旨在最大化风场的整体发电效率。仿…

数字芯片——时钟与复位

关于此次章节我想要探讨的问题是门控时钟的处理&#xff08;Clock Gating Methodology&#xff09;和时钟复位策略。在低功耗设计中&#xff0c;门控时钟是结构最简洁&#xff0c;最容易实现的电路结构。如上期所讲的&#xff0c;一个控制信号和时钟逻辑与在一起输出的信号作用…

redis设计与实现(四)服务器中的数据库

服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态server.h结构的db数组中&#xff0c;db数组的每个项都是一个redis.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库。 在初始化服务器时&#xff0c;程序会根据服务器状态的dbnum属性来决定应该创建多少…

产品人生(12):从“产品生命周期管理”看如何做“职业规划”

产品生命周期管理是产品人常接触的一个概念&#xff0c;它是一种全面管理产品从概念构想、设计开发、生产制造、市场推广、销售使用&#xff0c;直至最终退役的全生命周期过程的方法论和一系列业务流程。下面我们来简单介绍下产品生命周期管理&#xff1a; 概念阶段&#xff1a…

C++ | Leetcode C++题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:void addPath(vector<int> &vec, TreeNode *node) {int count 0;while (node ! nullptr) {count;vec.emplace_back(node->val);node node->right;}reverse(vec.end() - count, vec.end());}vect…

【全开源】多平台租房系统源码(Fastadmin+ThinkPHP+Uniapp)

&#x1f3e0;多平台租房系统&#xff1a;一站式租房新体验&#x1f50d; &#x1f310;一、引言&#xff1a;租房市场的变革 在快节奏的现代生活中&#xff0c;租房已成为许多人解决居住问题的首选。然而&#xff0c;传统的租房方式往往繁琐且效率低下。随着互联网的飞速发展…

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载)

macOS Sequoia 将 Mac 生产力与智能化提升至全新高度 (macOS 15 ISO、IPSW、PKG 下载) iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接&#xff1a;https://sysin.org/blog/macOS-Sequoia/&a…

全方位·多层次·智能化,漫途水库大坝安全监测方案

党的十九届五中全会提出&#xff0c;到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 加快推进小型水库除险加固。加快构建气象卫星和测雨雷达、雨量站、水文站组成…

GIS之arcgis系列10:arcpy实现批量掩膜提取

按掩膜提取 (Spatial Analyst) 提取掩膜所定义区域内的相应栅格像元。 OutRas ExtractByMask(InRas1, InMsk1, "INSIDE") 使用情况 输入栅格中的其他属性&#xff08;若有的话&#xff09;将按照原样添加到输出栅格属性表。 根据所记录的属性&#xff0c;某些属性…

Golang | Leetcode Golang题解之第145题二叉树的后序遍历

题目&#xff1a; 题解&#xff1a; func reverse(a []int) {for i, n : 0, len(a); i < n/2; i {a[i], a[n-1-i] a[n-1-i], a[i]} }func postorderTraversal(root *TreeNode) (res []int) {addPath : func(node *TreeNode) {resSize : len(res)for ; node ! nil; node n…