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

  1. 使用top命令查询占用CPU最多的线程,记录其pid,shitf+p可以按照CPU使用率进行排序;
  2. 使用 top -H -p <pid> 查看进程中哪个线程占用CPU最高,记录线程id;
  3. 将十进制是tid转换为16进制,printf %x <tid>;
  4. 将线程栈信息输入到文件,jstack <tid> > <tid.log>;
  5. 查看日志信息 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、

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL系列】MySQL复合查询的学习 _ 多表查询 | 自连接 | 子查询 | 合并查询

「前言」文章内容大致是对MySQL复合查询的学习。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、基本查询回顾二、多表查询三、自连接四、子查询4.1 单行子查询4.2 多行子查询4.3 多列子查询4.4 在from子句中使用子查询 五、合并查询 一、基本查询回顾…

解密算法与数据结构面试:程序员如何应对挑战

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Windows版本Docker安装详细步骤

文章目录 下载地址安装异常处理docker desktop requires a newer wsl 下载地址 https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exe 安装 双击下载的文件Docker Desktop Installer.exe进行安装 点击OK 开始安装 安装完成点击Close and restart&…

电脑不安装软件,怎么将手机文件传输到电脑?

很多人都知道&#xff0c;AirDroid有网页版&#xff08;web.airdroid.com&#xff09;。 想要文件传输&#xff0c;却不想在电脑安装软件时&#xff0c;AirDroid的网页版其实也可以传输文件。 然而&#xff0c;要将文件从手机传输文件到网页端所在的电脑时&#xff0c;如果按…

“惠医通-医院挂号订单平台”

结合已学习过的vue3和TS完成的项目&#xff0c;便于患者对自己想要就诊的科室进行挂号&#xff0c;付款 一&#xff1a;项目简介 前端技术栈 Vue3 TS vue-router Element-ui Axios Pinia 项目架构 二&#xff1a;主要模块 1. axios二次封装 1.1 创建实例 //利用axios.creat…

视频融合平台EasyCVR视频汇聚平台关于小区高空坠物安全实施应用方案设计

近年来&#xff0c;随着我国城市化建设的推进&#xff0c;高楼大厦越来越多&#xff0c;高空坠物导致的伤害也屡见不鲜&#xff0c;严重的影响到人们的生命安全。像在日常生活中一些不起眼的小东西如烟头、鸡蛋、果核、易拉罐&#xff0c;看似伤害不大&#xff0c;但只要降落的…

Go【gin和gorm框架】实现紧急事件登记的接口

简单来说&#xff0c;就是接受前端微信小程序发来的数据保存到数据库&#xff0c;这是我写的第二个接口&#xff0c;相比前一个要稍微简单一些&#xff0c;而且因为前端页面也是我写的&#xff0c;参数类型自然是无缝对接_ 前端页面大概长这个样子 先用apifox模拟发送请求测试…

①matlab的命令掌握

目录 输入命令 命名变量 保存和加载变量 使用内置的函数和常量 输入命令 1.您可以通过在命令行窗口中 MATLAB 提示符 (>>) 后输入命令 任务 使用命令 3*5 将数值 3 和 5 相乘。 答案 3*5 2.除非另有指定&#xff0c;否则 MATLAB 会将计算结果存储在一个名为 ans…

美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以?

周末的时候,有一位小伙伴提了一些关于 ConcurrentHashMap 的问题,都是他最近面试遇到的。原提问如下(星球原贴地址:https://t.zsxq.com/11jcuezQs ): 整个提问看着非常复杂,其实归纳来说就是两个问题: ConcurrentHashMap 为什么 key 和 value 不能为 null?ConcurrentH…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型&#xff0c;JAVA 定义实体类 Id Long id 2、查询数据库&#xff0c;此数据存在 3、使用 shell 查询&#xff0c;查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决&#xff08;一&#xff09; long 在 mongo中为 int64 类型…

clickhouse(十四、分布式DDL阻塞及同步阻塞问题)

文章目录 一、分布式ddl 阻塞、超时现象验证方法解决方案 二、副本同步阻塞现象验证解决方案 一、分布式ddl 阻塞、超时 现象 在clickhouse 集群的操作中&#xff0c;如果同时执行一些重量级变更语句&#xff0c;往往会引起阻塞。 一般是由于节点堆积过多耗时的ddl。然后抛出…

论文阅读:Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks

前言 要弄清MAML怎么做&#xff0c;为什么这么做&#xff0c;就要看懂这两张图。先说MAML**在做什么&#xff1f;**它是打着Mate-Learing的旗号干的是few-shot multi-task Learning的事情。具体而言就是想训练一个模型能够使用很少的新样本&#xff0c;快速适应新的任务。 定…

PCB电路板电压电流监测软件

PCB电路板电流监测软件详细设计说明书是一个详细描述软件系统设计和实现的文档&#xff0c;它提供了软件系统的架构、功能模块、接口设计、数据存储和处理、界面设计、数据库设计、系统测试、部署和维护计划等方面的详细信息。模拟量采集/老化房采集软件 该文档的目的是为了确保…

深入解析文件系统原理(inode,软硬链接区别)

第四阶段提升 时 间&#xff1a;2023年8月29日 参加人&#xff1a;全班人员 内 容&#xff1a; 深入解析文件系统原理 目录 一、Inode and Block概述 &#xff08;一&#xff09;查看文件的inode信息&#xff1a;stat &#xff08;二&#xff09;Atime、Mtime、Ctime详…

计算机网络aaaaaaa

差错检测 在一段时间内&#xff0c;传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate) 11111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111111111111111111111111111111111111111111111111111111111111111111111…

「Vue|网页开发|前端开发」02 从单页面到多页面网站:使用路由实现网站多个页面的展示和跳转

本文主要介绍如何使用路由控制来实现将一个单页面网站扩展成多页面网站&#xff0c;包括页面扩展的逻辑&#xff0c;vue的官方路由vue-router的基本用法以及扩展用法 文章目录 本系列前文传送门一、场景说明二、基本的页面扩展页面扩展是在扩什么创建新页面的代码&#xff0c;…

Linux内核源码分析 (3)调度器的实现

Linux内核源码分析 (3)调度器的实现 文章目录 Linux内核源码分析 (3)调度器的实现一、概述二、调度器数据结构1、task_struct中与调度有关的的成员2、调度器类3、就绪队列4、调度实体 三、处理优先级1、优先级的内核表示2、计算优先级3、计算负荷权重 四、核心调度器1、周期性调…

网络安全(黑客技术)学习手册

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

VBA技术资料MF48:VBA_在Excel中将列号与字母转换

【分享成果&#xff0c;随喜正能量】除非自己的认知获得了改变和刷新&#xff0c;否则&#xff0c;人们常说的“顺应自己的内心”&#xff0c;顺的不过是一颗旧心&#xff0c;一颗惯性的&#xff0c;充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反&#xff0c;人要用…

自动化PLC工程师能否转到c#上位机开发?

成功从自动化PLC工程师转向C#上位机开发的经历可能因人而异&#xff0c;以下是一些分享的思路和建议&#xff1a;扩展编程技能&#xff1a;学习C#语言和相关的开发工具和框架&#xff0c;掌握语言的基础知识和常用的编程技巧。可以通过在线教程、培训课程、书籍等途径进行学习&…