JVM知识点(二)

news2024/11/25 22:42:27

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、

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

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

相关文章

嵌入式学习笔记——ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集&#xff08;32-bit&#xff09; Thumb态-Thumb指令集&#xff08;16-bit&#xff09; Thumb2态-Thumb2指令集&#xff08;16 & 32 bit&#xff09; Thumb指令集是对ARM指令集的一个子集重新编码得到的&#xff0c;指令长度为16位。通常在…

自编码器:数据降维和特征提取的新方法

文章目录 自编码器的原理编码过程解码过程 自编码器的应用数据降维特征提取 拓展应用总结 &#x1f389;欢迎来到AIGC人工智能专栏~自编码器&#xff1a;数据降维和特征提取的新方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f…

LeetCode第6~10题解

CONTENTS LeetCode 6. N 字形变换&#xff08;中等&#xff09;LeetCode 7. 整数反转&#xff08;中等&#xff09;LeetCode 8. 字符串转换整数-atoi&#xff08;中等&#xff09; LeetCode 6. N 字形变换&#xff08;中等&#xff09; 【题目描述】 将一个给定字符串 s 根据…

一文搞懂深度信念网络!DBN概念介绍与Pytorch实战

目录 一、概述1.1 深度信念网络的概述1.2 深度信念网络与其他深度学习模型的比较结构层次学习方式训练和优化应用领域 1.3 应用领域图像识别与处理自然语言处理推荐系统语音识别无监督学习与异常检测药物发现与生物信息学 二、结构2.1 受限玻尔兹曼机&#xff08;RBM&#xff0…

第三方ipad笔哪个牌子好用?开学季ipad触控笔推荐

现在&#xff0c;对于ipad用户来说&#xff0c;苹果Pencil系列绝对是他们最好的选择。但价格太贵了&#xff0c;普通用户根本买不起。所以&#xff0c;在实际应用中&#xff0c;选择一种性能好&#xff0c;价格便宜的电容笔就显得尤为重要。身为一名“苹果粉”&#xff0c;又是…

【LeetCode-中等题】24. 两两交换链表中的节点

文章目录 题目方法一&#xff1a;递归方法二&#xff1a;三指针迭代 题目 方法一&#xff1a;递归 图解&#xff1a; 详细版 public ListNode swapPairs(ListNode head) {/*递归法:宗旨就是紧紧抓住原来的函数究竟返回的是什么?作用是什么即可其余的细枝末节不要细究,编译器…

linux删除文件恢复

linux文件恢复救大命 早上不小心将部署文件删除了&#xff0c;内心十分复杂&#xff0c;终于找回部分损失&#xff0c;其中一个非常重要的点是&#xff0c;文件必须得是修改过或者运行过&#xff0c;在服务器中存在进程记录 sudo su # 进入root权限 lsof | grep deploy.py在这…

网络编程嵌套字

网络编程 程序员主要操作应用层和传输层来实现网络编程 也就是自己写一个程序&#xff0c;让这个程序可以使用网络来通信 这个程序属于应用层&#xff0c;实现通讯就需要获取到传输层提供的服务 这就需要使用传输层提供的api UDP&#xff1a;无连接&#xff0c;不可靠传输&a…

Mysql安装使用

Mysql下载: MySQL :: Download MySQL Community Server Mysql解压&#xff1a; 解压后在根目录新建data文件夹和新建my.ini文件 my.ini文件内容如下: 注意&#xff1a;记得修改目录位置 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\\mysql-5.7.30…

完美解决 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

拉取代码时报错&#xff1a; # Mac 报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key …

细说GNSS模拟器的RTK功能(一)

什么是RTK&#xff1f; 实时动态载波相位差分技术&#xff08;RTK&#xff09;是通过测试来纠正当前卫星导航&#xff08;GNSS&#xff09;系统常见误差的应用。RTK定位基于至少两个GNSS接收机——参考站和一个或多个流动站。 参考站在可视卫星中获取测量数据&#xff0c;然后…

PMAC使用实点网关模块与西门子1500PLC通讯

PMAC使用实点网关模块与西门子1500PLC通讯 硬件 1.PMAC 2.1500PLC 3.实点GW6-P20HM、GW6L-A0(EhterCat网关)、GW6L-B0(PN网关) 创建pmac程序 添加实点网关模块描述文件 扫描EtherCAT网络节点 右击Master0选择加载映射到Power Pmac&#xff0c;可查看EtherCat映射到pmac的…

亚马逊鲲鹏系统可多渠道提升关键词排名

亚马逊鲲鹏系统有三大渠道可以完全模拟人类真实操作行为&#xff0c;快速提高你产品在亚马逊的排名。有通过搜索、站外引流、直接访问产品三种方法。 通过亚马逊站点搜索&#xff1a;正常的登录到我们的亚马逊的主页&#xff0c;然后通过搜索设置的关键词&#xff0c;然后再进行…

2024年java面试(三)--spring篇

文章目录 1.spring的bean是线程安全的吗&#xff1f;2.什么是Spring IOC 容器&#xff1f;3.DI 依赖注入4.如何实现一个IOC容器5.Spring 的 IoC支持哪些功能&#xff1f;6.IOC初始化过程7.面向切面编程&#xff08;AOP&#xff09;8.AOP 思想9.AOP的应用场景10.AOP通知类型11.S…

linuxdeploy安装CentOS7搭建django服务

目录 一、busybox安装 二、linuxdeploy安装 三、linuxdeploy软件设置及安装 四、CentOS基础环境配置 五、CentOS7 上安装Python3.8.10 六、systemctl的替代品 七、CentOS7 上安装mysql5.2.27数据库 八、CentOS7 上安装Nginx服务 九、Django项目应用部署 参考文献: 一…

【100天精通python】Day46:python网络编程基础与入门

目录 专栏导读 1 网络编程的基础 2. 基本概念和协议 2.1 计算机网络基础 2.2 网络协议、IP地址、端口号 2.3 常见网络协议 3. 套接字编程 3.1 套接字的基本概念 3.2 套接字的基本操作 3.3 套接字通信模型和方法&#xff1a;send、recv 3.3.1 TCP通信模型 3.3.2 U…

模拟实现库函数strcpy以及strlen

目录 strcpy 介绍库函数strcpy 例子 分析模拟实现思路 补充 assert宏 const关键字来修饰源字符串的指针 代码展示 strlen 介绍库函数strcpy 例子 分析模拟实现思路 计数器 递归 指针-指针 代码展示 计数器 递归 指针-指针 strcpy 介绍库函数strcpy 这个库函…

docker 04.更加重要的命令

之前的都是基础命令&#xff0c; 前台交互进程和后台守护进程&#xff1a; 重新进入容器&#xff1a; docker中的导入导出&#xff1a; docker中的拷贝到&#xff1a;

SpringBoot整合OpenAI实现AI聊天 (精简demo)

1. OpenAI官网/*** 官网获取密钥基本条件* * 1. 翻墙, 能访问外网* 2. 拥有国外手机号码* 3. 注册账号* 4. 获取密钥*/https://openai.com/ 2. 获取OpenAI密钥 (怎么简单怎么来) // 直接在淘宝上购买, 买多几个随机访问 sk-xxxx 3. 依赖 <dependency><groupId>c…

智能客服系统:解决企业服务、管理难题的新选择

在数字化时代&#xff0c;智能客服系统是企业服务、管理的新选择。智能客服系统可以通过自然语言处理、人工智能等技术实现与顾客的智能对话&#xff0c;提升企业客服效率和服务质量。同时&#xff0c;智能客服系统也可以为企业提供实时数据分析和监管&#xff0c;进一步优化管…