JVM知识点(二)
1、G1垃圾收集器
- -XX:MaxGCPauseMillis=10,G1的参数,表示在任意1s时间内,停顿时间不能超过10ms;
- G1将堆切分成很多小堆区(Region),每一个Region可以是Eden、Survivor或Old区;这些区在内存上不是连续存放的;
- 每一块Region大小都是相同的,大小为1-32M,若Region对象存储不下,大小超过Region50%的对象,将会存放到Humongous Region;
- -XX:G1HeapRegionSize,可以调整Region大小;
- -XX:G1HeapWastePercent:可以调整GC回收的阈值,默认为5%;只有达到这个阈值,GC才会回收对象,避免GC花费大量时间,回收内存却比较少;

垃圾回收过程:
- G1“年轻代对象回收”,即Minor GC,发生时机为Eden满;
- 老年代垃圾收集,他是一个并发标记过程,会顺便清理一点对象;
- 混合清理,会同时清除年轻代和老年代对象;
RSet:
- RSet记录的其他Region对象应用本Region对象的关系,是一个hash结构,key为引用的Region的地址,value为应用本Region的对象卡页集合;
- 有了该结构,回收对象时,不必堆整个堆内存对象进行扫描;
- RSet占用空间较大,通常为5%;

2、高并发下估算和调优
(1)GC考量指标
- 系统容量:机器上的资源容量,资源容量限制比较严格的系统,对他的优化会越明显;
- 吞吐量:在一个时间段内完成多少事务操作;
- 延迟:等待时间;如查询一条sql,返回数据所等待时间;

(2)选择垃圾收集器
- 堆大小空间不是很大(如100MB),使用串行收集器效果最好,XX:+UseSerialGC;
- 如果机器为单核CPU,选择串行收集器较好;
- 如果应用为“吞吐优先”,并且堆停顿时间没有要求,使用并行收集器合适,XX:+UseParallelGC;
- 如果应用对响应时间要求较高,使用G1,CMS,ZGC较为合适,-XX:+UseConcMarkSweepGC、-XX:+UseG1GC、-XX:+UseZGC ,但会额外使用资源处理;
(3)大流量应用特点
- 对延迟非常敏感的应用,通常可以通过机器集群来解决;
- 考量系统指标有:
-
- TPS:每秒处理的事务数量;
- AVG:平均响应时间;
- TP:表示机器有多少请求响应时间小于x毫秒;如TP80,代表有80%的请求响应时间小于x毫秒;
(4)估算
假设高峰请求6w/s,共有10台机器,每个请求大小20k,则每台机器JVM的流量为120MB/s

(5)调优
- 假设给JVM分配了5460MB空间,则年轻代占用空间为5460/3=1820MB,Eden区大小大约为1820/10*8=1456MB,按照上面估算的120MB/s的流量,大约12s需要发生一次Minor GC;
- 每隔半小时,会发送一次Major GC,Survivor区大小为182MB,若幸存下来的对象大于Survivor区内存大小,则会将对象直接分配到Old区,这样导致垃圾存储时间更长,只有Old区满了才能清除;
- 大部分对象存活时间短,在Eden区发生GC后,会回收大量对象,我们可以分配一半的空间给Eden区,通过配置-XX:+UseConcMarkSweepGC -Xmx5460M -Xms5460M -Xmn2730M,Eden区发生GC时间为2730/10*8/120=18s;
- 调大年轻代,顺便调大幸村去,这样对象在年轻代存活时间越大;
- 元空间在扩容时,会发生Full GC,默认大小为20MB,可以通过参数- -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M将其调大,减少发生Full GC;
3、OOM问题排查
(1)分析那个线程影响CPU
- 使用top命令查询占用CPU最多的线程,记录其pid,shitf+p可以按照CPU使用率进行排序;
- 使用 top -H -p <pid> 查看进程中哪个线程占用CPU最高,记录线程id;
- 将十进制是tid转换为16进制,printf %x <tid>;
- 将线程栈信息输入到文件,jstack <tid> > <tid.log>;
- 查看日志信息 less <tid.log>;
(2)内存泄漏
- 内存溢出是结果,内存泄漏是一个原因;
- 不再被使用的对象,没有被切断和GC root链接,会导致内存泄漏;
- 使用hashmap缓存数据时,没有使用LRU等策略,导致hashmap数据量越来越多,最终导致内存泄漏;
- 操作文件读写时,没有将close放入finally中,最终导致文件描述符越来越多,导致内存泄漏;
4、JMM
(1)JMM结构
- 主存储器:所有实例对象存储的位置,实例所拥有的字段也存储在里面,是所有线程共享的;
- 工作存储器:每个线程都有自己的工作存储器,工作存储器存储主存储器所必要的数据拷贝;
- 线程无法直接对主存储器进行操作,只能通过主存进行通信;

(2)操作类型
- read:作用于主内存,将共享变量从主内存传送到工作内存中;
- load:作用于工作内存,将read中的值读取到的值放入工作内存的变量副本中;
- store:作用于工作内存,将工作内存中的变量副本传送到主内存中;
- write:作用于主内存中,将strore的值写入到主内存的共享变量中;
- use:作用域工作内存,会将工作内存的值传递给执行引擎,每当虚拟机需要使用该变量,就会执行该操作;
- assign:作用于工作内存,每当虚拟机遇到一个赋值指令,就会把执行引擎中获取的值赋值给工作内存中的变量;
- lock:作用于主内存,将变量标记为线程独占状态;
- unlock:作用于主内存,释放独占状态;

(3)三大特性
- 原子性:JMM 保证了 read、load、assign、use、store 和 write 六个操作具有原子性,除了long、double,其余基本数据类型都是原子性的;
- 可见性:一个线程修改了变量,会同步给主内存,赶在其他线程修改之前刷新主内存。使用volatile修饰变量,变量更新会立即同步到主内存中,其他线程修改该变量之前,需要到主内存中拉取变量更新到自己的工作内存;
- 有序性:在线程中观察,可以发现操作是有序的,而在另外一个线程中观察,操作是无序的;java中有一些默认的happen-before:
-
- 程序次序:一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作。
- 监视器锁定:unLock 操作先行发生于后面对同一个锁的 lock 操作。
- volatile:对一个变量的写操作先行发生于后面对这个变量的读操作。
- 传递规则:如果操作 A 先行发生于操作 B,而操作 B 又先行发生于操作 C,则操作 A 先行发生于操作 C。
- 线程启动:对线程 start() 的操作先行发生于线程内的任何操作。
- 线程中断:对线程 interrupt() 的调用先行发生于线程代码中检测到中断事件的发生,可以通过 Thread.interrupted() 方法检测是否发生中断。
- 线程终结规则:线程中的所有操作先行发生于检测到线程终止,可以通过 Thread.join()、Thread.isAlive() 的返回值检测线程是否已经终止。
- 对象终结规则:一个对象的初始化完成先行发生于它的 finalize() 方法的开始。
(4)内存屏障
- load-load barriers:指令前插入load Barriers,会使高速缓存直接失效,强制重新从主内存加载数据;如下:load1数据的加载会先于load2及后面的数据的加载
load1
LoadLoad
load2
- load-store Barriers:load1数据的加载会先于store2及后面数据存储指令加载到主内存;
load1
LoadStore
store2
- store-store Barriers:store1数据写入主内存,优先于store2及后面的数据写入主内存,使用store barriers,能让写入缓存的数据最快加载如主内存,让其他线程可见;
store1
StoreStore
store2
- store-load Barriers:在load2及后续所有读取操作执行之前,保证store1写入对多有处理器都可见;开销最大,涵盖前三条;
store1
StoreLoad
load2
5、字节码看并发编程
(1)线程模型
- 对于java虚拟机中,每一个java线程会对应一个轻量级进程LWP;
- 轻量级线程是调用系统内核所提供的一套接口,实际上还需要调用内核线程KLT;
- 具体的概念,如创建,同步等,需要进行系统调用;
- 系统调用需要用户态和内核态进行切换,即上下文切换,开销较大;

(2)Synchronized字节码
- 方法加上Synchronized关键字,字节码是在flag标志处加上同步标志;

- 对对象使用synchronized,字节码是通过一套monitorenter,monitorexit来使用的

public class SynchronizedDemo {synchronized void m1() {System.out.println("m1");}final Object lock = new Object();void doLock() {synchronized (lock) {System.out.println("lock");}}
}
(3)对象内存布局
- Mark Word:用来存储 hashCode、GC 分代年龄、锁类型标记、偏向锁线程 ID、CAS 锁指向线程 LockRecord 的指针等,synconized 锁的机制与这里密切相关;
- Class Point:用于执行对象所对应的类元数据信息,JVM通过他直到对象属于哪个Class;
- Instance Data:真正存储对象数据,如字段内容等;
- Padding:对象字节必须为8倍数,该字段会自动填充到8倍数;

6、
相关文章:
JVM知识点(二)
1、G1垃圾收集器 -XX:MaxGCPauseMillis10,G1的参数,表示在任意1s时间内,停顿时间不能超过10ms;G1将堆切分成很多小堆区(Region),每一个Region可以是Eden、Survivor或Old区;这些区在…...
代码随想录算法训练营day44 | LeetCode 518. 零钱兑换 II 377. 组合总和 Ⅳ
今晚学习了完全背包的做法,和01背包的差别具体来说就是一个可以重复,一个不可以重复。体现在数组的遍历中来说就是完全背包不能用二维数组做法(因为二维dp数组一定不会重复,但是还没验证过),只能用一维dp数…...
Vue2向Vue3过度核心技术工程化开发和脚手架
目录 1 工程化开发和脚手架1.1 开发Vue的两种方式1.2.脚手架Vue CLI 2 项目目录介绍和运行流程2.1 项目目录介绍2.2 运行流程 3 组件化开发4 根组件 App.vue4.1 根组件介绍4.2 组件是由三部分构成4.3 总结 5 普通组件的注册使用-局部注册5.1 特点:5.2 步骤ÿ…...
Expected all tensors to be on the same device, but found at least two devices
Expected all tensors to be on the same device, but found at least two devices, 原因是计算的过程中,两个不同类型的变量在一起进行运算,即一个变量存储在gpu中,一个变量存储在cpu中,两个变量的存储位置冲突,导致无…...
Mysql备份命令Mysqldump导入、导出以及压缩成zip、gz格式
1、导出 命令:mysqldump -u用户名 -p数据库密码 数据库名 > 文件名 如果用户名需要密码,则需要在此命令执行后输入一次密码核对;如果数据库用户名不需要密码,则不要加“-p”参数,导入的时候相同。注意输入的用户名…...
App卡帧与BlockCanary
作者:图个喜庆 一,前言 app卡帧一直是性能优化的一个重要方面,虽然现在手机硬件性能越来越高,明显的卡帧现象越来越少,但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发,讨论屏…...
bpmnjs Properties-panel拓展(ExtensionElements拓展篇)
接上文bpmnjs Properties-panel拓展(属性设置篇),继续记录下第三个拓展需求的实现。 需求简述 在ExclusiveGateway标签的extensionElements标签中增加子标签<activiti:executionListener>子标签,可增加复数子标签。子标签…...
虚拟机的使用
首先需要安装VMware软件,这是虚拟机,在里面可以实现在windows的笔记本上运行包括,windows11和linux系统的开发和研究。 VMware是一种虚拟化技术,可以让你在一台物理计算机上运行多个操作系统和应用程序,而不需要重启或…...
CSS Flex布局
前言 Flex布局(弹性盒子布局) 是一种用于在容器中进行灵活和自适应布局的CSS布局模型。通过使用Flex布局,可以更方便地实现各种不同尺寸和比例的布局,使元素在容器内自动调整空间分配。 Flex-组成 Flex布局由以下几个主要组成部分…...
Virtual
虚拟接口可以用作编写操作系统和驱动程序独立测试的一种方式。任何连接到同一通道(来自同一Python进程)的VirtualBus实例都将相互接收消息。 如果消息应跨进程或主机边界发送,请考虑使用多播IP接口,并参考虚拟接口对不同虚拟接口进行比较和一般性讨论。 Example import …...
6、监测数据采集物联网应用开发步骤(5.2)
监测数据采集物联网应用开发步骤(5.1) 包含4个类数据库连接(com.zxy.db_Self.ConnectionPool_Self.py)、数据库操作类(com.zxy.db_Self.Db_Common_Self.py)、数据库管理类(com.zxy.db_Self.DBManager_Self.py…...
解释 Git 的基本概念和使用方式
该文为AI自动生成,InsCode AI 创作助手 Git 是一种版本控制工具,用于跟踪代码或文件的更改历史记录。以下是 Git 的基本概念和使用方式: 仓库 (Repository):仓库是一个存储项目代码和历史记录的地方,可以在本地或远程…...
不同ubuntu系统下的不同ros系统可以互相通讯吗
可以的,不同版本的Ubuntu系统和ROS版本的机器仍然可以实现ROS节点之间的通信。 主要的原因有:1. ROS节点间通信是通过ROS master实现的。不同机器上的ROS节点都可以连接到同一个ROS master,从而实现通信。 2. ROS消息系统可以兼容不同的ROS版本。即使节点使用的ROS版本不同,也…...
数学建模-模型详解(2)
微分模型 当谈到微分模型时,通常指的是使用微分方程来描述某个系统的动态行为。微分方程是描述变量之间变化率的数学方程。微分模型可以用于解决各种实际问题,例如物理学、工程学、生物学等领域。 微分模型可以分为两类:常微分方程和偏微分…...
IT运维:使用数据分析平台监控DELL服务器
概述 在企业日常运维中,我们有着大量的服务器设备,设备故障一般可以通过常用的监控软件实现自动告警,但如果在管理运维中我们要做的不仅仅是发现故障,处理硬件故障,我们还需要进一步的了解,今年一共出现了多…...
Spring Cloud Alibaba-Sentinel规则
1 流控规则 流量控制,其原理是监控应用流量的QPS(每秒查询率) 或并发线程数等指标,当达到指定的阈值时 对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。 第1步: 点击簇点链路,我们就可以看到访…...
go http-proxy
我们这里主要讲使用HTTP/1.1协议中的CONNECT方法建立起来的隧道连接,实现的HTTP Proxy。这种代理的好处就是不用知道客户端请求的数据,只需要原封不动的转发就可以了,对于处理HTTPS的请求就非常方便了,不用解析他的内容…...
用变压器实现德-英语言翻译【01/8】:嵌入层
一、说明 本文是“用变压器实现德-英语言翻译”系列的第一篇文章。它引入了小规模的嵌入来建立感知系统。接下来是嵌入层的变压器使用。下面简要概述了每种方法,然后是德语到英语的翻译。 二、技术背景 嵌入层的目标是使模型能够详细了解单词、标记或其他输入之间的…...
【vue3.0中ref与reactive的区别及使用】
什么是ref与reactive ref与reactive都是Vue3.0中新增的API,用于响应式数据的处理。 1. ref ref是一个函数,可以用于将一个普通的数据类型转换成响应式数据。ref返回一个包含value属性的对象,通过修改value属性的值,可以触发组件…...
计算机竞赛 基于情感分析的网络舆情热点分析系统
文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…...
树莓派Pico上使用Blinka兼容层调用CircuitPython传感器库
1. 项目概述与核心价值如果你手头有一块树莓派 Pico,正在用 MicroPython 开发,但眼馋 CircuitPython 生态里那海量且维护良好的传感器驱动库,比如 Adafruit 官方出品的那些,那么你肯定想过:能不能直接在 MicroPython 里…...
Pytorch图像去噪实战(九十三):数据集版本管理实战,保证每次训练数据可追溯、可回滚
Pytorch图像去噪实战(九十三):数据集版本管理实战,保证每次训练数据可追溯、可回滚 一、问题场景:模型效果变好了,但不知道用了哪批数据训练 图像去噪项目进入迭代阶段后,数据会不断变化: 新增用户反馈样本 新增真实噪声数据 删除低质量图片 加入OCR场景样本 加入低光…...
taotoken用量看板如何帮助个人开发者清晰掌握月度ai支出
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken用量看板如何帮助个人开发者清晰掌握月度ai支出 对于个人开发者或小型工作室而言,将大模型能力集成到项目中是…...
被论文压到喘不过气?Paperxie 本科论文功能,把你的毕业节奏拉回正轨
paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPThttps://www.paperxie.cn/ai/dissertationhttps://www.paperxie.cn/ai/dissertation 毕业季的焦虑,一半来自答辩,一半来自毕业论文。选题卡壳、文献找不全、格式改到崩溃、写了…...
AI应用开发与AI Agent开发:小白程序员必备技能,收藏学习迎高薪未来!
本文介绍了AI应用开发和AI Agent开发的核心概念和区别,通过传统后端开发、AI应用开发和AI Agent开发三个场景的对比,阐述了AI技术如何赋能产品和服务。AI应用开发是将大模型能力嵌入产品,而AI Agent开发则是让大模型自主完成任务。文章还结合…...
Windows 系统安装阶段快速创建本地账户操作说明
Windows 系统安装阶段快速创建本地账户操作说明 一、功能概述 本操作适用于 Windows 10/11 系统初始化联网配置(OOBE)界面,可直接绕过微软账户强制登录流程,一键启动本地账户创建向导,自定义设置系统用户名,…...
物联网技术如何重塑智能电网的底层架构
1. 物联网技术重塑智能电网的底层逻辑2003年美加大停电事故导致5000万人陷入黑暗,这场灾难直接催生了现代智能电网的诞生。如今,当我们谈论智能电网时,本质上是在讨论一个由物联网(IoT)技术重构的能源神经系统。这个系统通过海量智能终端实时…...
DeepSeek Saga模式性能压测实录(TPS从1.2K飙升至8.6K):异步事件总线+快照版本向量的组合拳揭秘
更多请点击: https://intelliparadigm.com 第一章:DeepSeek Saga模式性能压测实录(TPS从1.2K飙升至8.6K):异步事件总线快照版本向量的组合拳揭秘 在真实生产级负载下,DeepSeek R1模型启用Saga模式后&#…...
基于MCP协议的Claude对话历史管理工具:架构、配置与实战
1. 项目概述:一个为Claude桌面应用量身定制的历史记录管理工具如果你和我一样,是Claude桌面应用的深度用户,那你一定对那个内置的对话历史管理功能颇有微词。它太基础了,基础到几乎只能算是一个“查看器”。想按日期、按项目、按关…...
Maple Mono 字体配置终极指南:从基础安装到高级定制
Maple Mono 字体配置终极指南:从基础安装到高级定制 【免费下载链接】maple-font Maple Mono: Open source monospace font with round corner, ligatures and Nerd-Font icons for IDE and terminal, fine-grained customization options. 带连字和控制台图标的圆角…...
