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…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
