浅学JVM
一、基本概念
目录
一、基本概念
二、JVM 运行时内存
1、新生代
1.1 Eden 区
1.2. ServivorFrom
1.3. ServivorTo
1.4 MinorGC 的过程 (复制- >清空- >互换)
1.4.1:eden 、servicorFrom 复制到ServicorTo,年龄+1
1.4.2:清空eden 、servicorFrom
1.4.3:ServicorTo 和ServicorFrom 互换
2、老年代
3、永久代
JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收, 堆 和 一个存储方法域。 JVM 是运行在操作系统之上的,它与硬件没有直接的交互。
二、JVM 运行时内存
Java 堆从 GC 的角度还可以细分为: 新生代(Eden区、 From Survivor 区和 To Survivor 区)和老年 代。 1、1、

1、新生代
是用来存放新生的对象。 一般占据堆的 1/3 空间。由于频繁创建对象, 所以新生代会频繁触发 MinorGC 进行垃圾回收。新生代又分为 Eden 区、 ServivorFrom、ServivorTo 三个区。
1.1 Eden 区
Java 新对象的出生地 (如果新创建的对象占用内存很大, 则直接分配到老 年代) 。当 Eden 区内存不够的时候就会触发 MinorGC,对新生代区进行 一次垃圾回收。
1.2. ServivorFrom
上一次 GC 的幸存者,作为这一次 GC 的被扫描者。
1.3. ServivorTo
保留了一次 MinorGC 过程中的幸存者。
1.4 MinorGC 的过程 (复制- >清空- >互换)
MinorGC 采用复制算法。
1.4.1:eden 、servicorFrom 复制到ServicorTo,年龄+1
首先, 把 Eden 和 ServivorFrom 区域中存活的对象复制到 ServicorTo 区域(如果有对象的年 龄以及达到了老年的标准,则赋值到老年代区), 同时把这些对象的年龄+1 (如果 ServicorTo 不 够位置了就放到老年区) ;
1.4.2:清空eden 、servicorFrom
然后, 清空 Eden 和 ServicorFrom 中的对象;
1.4.3:ServicorTo 和ServicorFrom 互换
最后, ServicorTo 和 ServicorFrom 互换,原 ServicorTo 成为下一次 GC 时的 ServicorFrom
区。
2、老年代
主要存放应用程序中生命周期长的内存对象。
老年代的对象比较稳定,所以 MajorGC 不会频繁执行。在进行 MajorGC 前一般都先进行 了一次 MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足 够大的连续空间分配给新创建的较大对象时也会提前触发一次 MajorGC 进行垃圾回收腾出空间。
MajorGC 采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没 有标记的对象。 MajorGC 的耗时比较长, 因为要扫描再回收。 MajorGC 会产生内存碎片,为了减 少内存损耗, 我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的 时候, 就会抛出 OOM( Out of Memory)异常。
3、永久代
指内存的永久保存区域, 主要存放 Class 和 Meta (元数据) 的信息,Class 在被加载的时候被 放入永久区域 ,它和和存放实例的区域不同,GC 不会在主程序运行期对永久区域进行清理。所以这 也导致了永久代的区域会随着加载的 Class 的增多而胀满,最终抛出 OOM 异常。
三、运行过程
我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件, 也就是字节码文件,
而字节码文件又通过 Java 虚拟机中的解释器, 编译成特定机器上的机器码 。
也就是如下:
① Java 源文件— - >编译器— - >字节码文件
② 字节码文件— - >JVM— - >机器码
每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是 Java 为什么能够 跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会 存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。

四、线程
这里所说的线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。 Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓 冲区分配、同步对象、栈、程序计数器等准备好以后, 就会创建一个操作系统原生线程 。 Java 线程结束, 原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可
用的 CPU 上。当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。当线程结束时,
会释放原生线程和 Java 线程的所有资源。
Hotspot JVM 后台运行的系统线程主要有下面几个:
虚拟机线程 (VM thread) 这个线程等待 JVM 到达安全点操作出现。这些操作必须要在独立的线程里执行,因为当 堆修改无法进行时, 线程都需要 JVM 位于安全点。这些操作的类型有: stop-the-
world 垃圾回收、线程栈 dump、线程暂停、线程偏向锁(biased locking)解除。
周期性任务线程--》这线程负责定时器事件(也就是中断), 用来调度周期性操作的执行。
GC 线程--》这些线程支持 JVM 中不同的垃圾回收活动。
编译器线程--》这些线程在运行时将字节码动态编译成本地平台相关的机器码。
相关文章:
浅学JVM
一、基本概念 目录 一、基本概念 二、JVM 运行时内存 1、新生代 1.1 Eden 区 1.2. ServivorFrom 1.3. ServivorTo 1.4 MinorGC 的过程 (复制- >清空- >互换) 1.4.1:eden 、servicorFrom 复制到ServicorTo,年龄1 …...
算法训练营64-图论-深度优先优先搜索(dfs)-广度优先搜索(bfs)
题目:98. 所有可达路径 (kamacoder.com) 邻接矩阵表示图 #include<bits/stdc.h>using namespace std;vector<vector<int>> reslut; vector<int> path;void dfs(vector<vector<int>>& map, int start, int end) {if(start…...
kotlin函数
1、函数定义 // 下边定义了main函数 fun main() {} 2、函数的类型 // foo函数定义 fun foo () {} // 对应无参类型 () -> Unit fun foo (a: Int):String {} // 对应有参类型 (Int) -> String 3、函数的引用 函数的引用类似C语言中的函数指针,可用于函数传…...
深入理解计算机系统 CSAPP 家庭作业7.12
A:refptr (unsigned)(ADDR(r.symbol) r.addend - refaddr) 0x4004f8 (-4) - 0x4004ea 0xa B:refaddr 0x4004d0 0xa 0x4004da refptr 0x400500 (-4) - 0x4004da 0x22 ...
Batch脚本中的环境变量沙盒:setlocal与endlocal全解析
Batch脚本中的环境变量沙盒:setlocal与endlocal全解析 在Windows的批处理(Batch)脚本世界中,setlocal和endlocal是两个至关重要的命令,它们为脚本中环境变量的修改提供了一个隔离的环境。这就像是为变量创建了一个临时…...
AI引领创意潮流:高效生成图片,参考图助力,一键保存到指定文件夹
在这个数字与创意交融的时代,我们迎来了AI绘画的新纪元。借助先进的AI技术,我们不仅能够高效生成图片,还能在参考图的启发下,激发无限创意,让您的想象力在数字世界中自由翱翔。 首助编辑高手软件中的魔法智能绘图板块&…...
ADOP带你了解:数据中心的高速互联解决方案
随着大语言模型和AIGC的飞速发展,数据中心对于高速、高可靠性的网络连接需求日益增长。ADOP系列产品正是在这样的背景下应运而生,为现代数据中心提供了全面的连接解决方案。 ADOP系列产品概览 ADOP系列产品旨在为云、高性能计算、Web 2.0、企业、电信、…...
使用SpringBoot整合Servlet
一、SpringBoot和Servlet的整合 1、用注解WebServlet配置Servlet映射 创建一个SpringBoot的web工程,在工程用创建一个Servlet 2、在SpringBoot的启动类上加注解ServletComponentScan 二、额外的方式 1、不使用WebServlet配置Servlet映射 创建一个SpringBoot工…...
vue引入eachrts
1. 安装Echarts 使用npm npm install echarts --save 导入Echarts插件 import echarts from echarts Vue.prototype.$echarts echarts import echarts from echarts 我们来做个简单的实例首先需要一个容器装下Echarts <template><div id"list"…...
c++ 智能指针实战分析
一.智能指针的设计思路 智能指针是类模板,再栈上创建智能指针对象。把普通指针交给智能指针对象。智能指针对象过期时,调用析构函数释放普通指针的内存。 智能指针的类型 auto_ptr是C98的标准,c17已经弃用。unique_ptr、shared_ptr和weak_…...
3D Web轻量引擎HOOPS Web Platform赋能AEC行业数字化,高效渲染与多格式支持!
在建筑、工程和施工(AEC)行业,数字化转型和高效协作正变得越来越重要。为应对日益复杂的项目需求和不断提升的质量标准,AEC企业需要一种强大的工具来实现高效的3D可视化和数据管理。HOOPS Web Platform作为一款综合性3D开发平台&a…...
学术英语写作为什么会成为留学生的压力?
对留学党来说,从出国前的标准化测试、申请文书,到留学后的学业要求,都需要用到学术英语写作。可以说,学术英语写作对留学生涯有着重要影响。 然而,这却是令很多中国学生头疼的问题,中国学生往往在数学、物…...
docker 安装达梦8
背景 X86-64架构使用Docker安装dm8_20240422_x86_rh6_64_rq_std_8.1.3.100_pack2.tar 1.下载Docker安装包 达梦官网下载dm8_20240422_x86_rh6_64_rq_std_8.1.3.100_pack2.tar安装包 快速下载通道: 达梦镜像包 2.将安装包上传至服务器,并加载镜像 拷…...
npm常用命令大全(非常详细)
npm(Node Package Manager)是Node.js的包管理工具,它允许你安装、更新、删除和管理Node.js项目的依赖。 以下是npm的一些常用命令,按照不同的功能进行分类和解释: 1. 初始化项目 init # 初始化一个新的npm项目&…...
东西方文化与管理探讨汉捷咨询汉捷咨询
东西方文化的发展不同,对于管理实践的影响也不相同。汉捷咨询从东西方文化的差异以管理体系的差异进行深层次分析,希望这些分析对企业家的管理实践起到良好的启发作用。 东西方文化的差异 东西方人在思维方式上存在的差异,其根源是什么呢&a…...
行业案例 | 智能终端设备的数据基础从哪儿来?
智能终端的快速发展让我们在许多科幻电影中看到的“未来场景”正在一步步变为现实:智能家居正在解放我们的双手,工业机器人让生产效率倍增,智能穿戴设备让我们便利地感知自身与外部的连结……然而,要想让万物“智联”,…...
《Windows API每日一练》6.1 鼠标基础知识
本节我们讲述鼠标的一些基础知识。 本节必须掌握的知识点: 鼠标 6.1.1 鼠标 鼠标是1964年由Douglas Engelbart发明的,用来取代由键盘输入的繁琐指令,简化电脑操作。早期的鼠标是单键鼠标,只有一个键,后来逐步改进为双…...
闹大了!OpenAI 宣布终止提供API服务
事件背景: OpenAI宣布终止对中国提供API服务,影响中国大陆的API开发者。受影响的开发者收到OpenAI的警告信,要求7月9日后停止服务。 OpenAI的业务和营收: 2023年营收16亿美元,2024年上半年年化营收达34亿美元。营收来…...
java里的空接口实现它有什么用?
我们在看源码时,经常会看到一些空接口,这些空接口里没有一个方法,实现它有什么作用呢?让我们先找几个常见的空接口看看。 一、Serializable接口 在Java中,一个常见的空接口就是java.io.Serializable。 public inter…...
Spring的jar包下载(最新版6.0版本)
1.在Spring官网的projects下面点击spring-framework 2.进入github官网 3.进入github后往下滑,点击Spring Framework Artifacts 4.往下滑找到 点击 5.在左边先点击Artifacts,在右边找到 libs-snapshot,展开libs-snapshot(之前其他…...
93%记忆精度的颠覆性突破:智能记忆系统如何重构AI认知能力
93%记忆精度的颠覆性突破:智能记忆系统如何重构AI认知能力 【免费下载链接】EverOS EverMemOS is an open-source, enterprise-grade intelligent memory system. Our mission is to build AI memory that never forgets, making every conversation built on previ…...
本地部署开源直播视频平台 Owncast 并实现外部访问
Owncast 是一款开源的、自托管的直播和视频平台,它允许用户完全掌控自己的直播基础设施、数据和观众互动,避免依赖 Twitch 、YouTube 等大型中心化平台,为内容创作者提供一个独立、去中心化的直播解决方案。本文将详细介绍如何利用 Docker 在…...
10分钟重塑Windows体验:Win11Debloat系统优化完全指南
10分钟重塑Windows体验:Win11Debloat系统优化完全指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更改以简化和改…...
VideoAgentTrek-ScreenFilter低光照与高对比度场景处理效果突破
VideoAgentTrek-ScreenFilter低光照与高对比度场景处理效果突破 不知道你有没有过这样的经历:在昏暗的房间里看手机,屏幕上的内容因为反光变得一片模糊;或者看一个明暗对比特别强烈的视频,亮的地方刺眼,暗的地方又黑得…...
从LTE到5G-Advanced:载波聚合(CA)技术演进全解析与网络工程师调试指南
从LTE到5G-Advanced:载波聚合技术深度演进与实战调试手册 当你在凌晨三点的基站机房盯着屏幕上跳动的KPI指标,突然发现某个5G小区下行速率始终无法突破800Mbps——这很可能是一个典型的载波聚合配置问题。作为网络优化工程师,我们每天都在与这…...
【实战】VSCode插件离线安装全攻略:从下载到部署
1. 为什么需要离线安装VSCode插件 作为一名在开发一线摸爬滚打多年的老码农,我遇到过太多因为网络问题导致插件安装失败的场景。比如去年在某大型制造企业的工厂MES系统升级项目中,开发环境完全隔离外网,但团队又急需使用GitLens和Python插件…...
【AI】JSON 格式:执行式AI数据交互核心语法
JSON 格式:执行式AI数据交互核心语法📝 本章学习目标:本章是入门认知部分,帮助零基础读者建立对AI Agent的初步认知。通过本章学习,你将全面掌握"JSON 格式:执行式AI数据交互核心语法"这一核心主…...
COMSOL报错别慌!像程序员一样‘调试’你的多物理场模型(附分步屏蔽法)
COMSOL报错别慌!像程序员一样‘调试’你的多物理场模型 面对COMSOL多物理场耦合模型报错时,许多工程师会陷入"哪里出错—如何修复"的循环焦虑。实际上,这类问题最有效的解决方式不是盲目修改参数,而是建立系统化的调试思…...
Qwen3-0.6B-FP8实战案例:为嵌入式系统开发提供代码生成与调试建议
Qwen3-0.6B-FP8实战案例:为嵌入式系统开发提供代码生成与调试建议 最近在折腾一个STM32的小项目,想用PWM调个呼吸灯,结果对着手册和寄存器配置了半天,不是时钟没配对就是占空比算错,一编译还报了一堆警告。相信不少搞…...
DFR0554双芯片显示模块驱动解析:PCA9633与AIP31068协同控制
1. DFR0554 显示模块驱动深度解析:基于 PCA9633 与 AIP31068 的双芯片协同架构 DFR0554 是 DFRobot 推出的一款集成化智能显示模块,其核心并非单一显示控制器,而是由两颗功能互补的专用 IC 协同构成: PCA9633 LED 驱动器 与 A…...
