JMM JVM 垃圾回收

news2024/11/24 18:39:35

目录

一、JMM内存模型 

1、定义

2、JMM的三大特性(可见性+原子性+有序性)

2.1 可见性

2.2 原子性

2.3 有序性

3、JMM中的8种原子操作

二、JVM

1、JVM体系结构

2、JVM参数调优

2.1 三大参数类型

2.2 九个调优参数

三、垃圾回收器

1、4种GC算法(引用计数 /复制拷贝/标记清除/标记整理)

2、4种垃圾回收器

2.1 主要4个(Serial / Parallel / CMS / G1)

 2.2 其它3个(ParNew / ParallelOld / SerialOld)

 3、使用范围


本文通过学习:周阳老师-尚硅谷Java大厂面试题第二季 总结的JMM,JVM,GC垃圾回收相关的笔记

一、JMM内存模型 

1、定义

JMM是Java内存模型,也就是Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式

JMM关于同步的规定:

(1)线程解锁前,必须把共享变量的值刷新回主内存

(2)线程解锁前,必须读取主内存的最新值,到自己的工作内存

(3)加锁和解锁是同一把锁

 

主内存计算机的内存,也就是经常提到的8G内存,16G内存
工作内存实例化 new student,那么 age = 25 也是存储在主内存中。当同时有三个线程同时访问 student中的age变量时,那么每个线程都会拷贝一份,到各自的工作内存,从而实现了变量的拷贝

2、JMM的三大特性(可见性+原子性+有序性)

2.1 可见性

当主内存区域中的值被某个线程写入更改后,其它线程会马上知晓更改后的值,并重新得到更改后的值。

2.2 原子性

一个或多个操作,要么全部执行,要么全部不执行。

2.3 有序性

(1)有序性:在本线程内观察,所有的操作都是有序的;而在一个线程内观察另一个线程,所有操作都是无序的。前半句指 as-if-serial 语义:线程内似表现为串行,后半句是指:“指令重排序现象”和“工作内存与主内存同步延迟现象”。处理器为了提高程序的运行效率,提高并行效率,可能会对代码进行优化。编译器认为,重排序后的代码执行效率更优。这样一来,代码的执行顺序就未必是编写代码时候的顺序了,在多线程的情况下就可能会出错。
(2)有序性问题:在多线程的环境下,由于执行语句重排序后,重排序的这一部分没有一起执行完,就切换到了其它线程,导致计算结果与预期不符的问题。这就是编译器的编译优化给并发编程带来的程序有序性问题。

3、JMM中的8种原子操作

(1)read 读取:作用于主内存,将共享变量从主内存传送到线程的工作内存中。
(2)load 载入:作用于工作内存,把 read 读取的值放到工作内存中的副本变量中。
(3)store 存储:作用于工作内存,把工作内存中的变量传送到主内存中。
(4)write 写入:作用于主内存,把从工作内存中 store 传送过来的值写到主内存的变量中。
(5)use 使用:作用于工作内存,把工作内存的值传递给执行引擎,当虚拟机遇到一个需要使用这个变量的指令时,就会执行这个动作。
(6)assign 赋值:作用于工作内存,把执行引擎获取到的值赋值给工作内存中的变量,当虚拟机栈遇到给变量赋值的指令时,就执行此操作。
(7)lock锁定: 作用于主内存,把变量标记为线程独占状态。
(8)unlock解锁: 作用于主内存,它将释放独占状态。

二、JVM

1、JVM体系结构

2、JVM参数调优

查看JVM默认参数的三种方法

方法1jps + jinfo

jps -l  查看java进程

jinfo flag 参数名 进程ID  查看某JVM参数

jinfo flags 进程ID 查看所有JVM参数

方法2

java -XX:+PrintFlagsInitial

java -XX:+printFlagsFinal

PrintFlagsInitial 打印JVM初始参数
printFlagsFinal 打印JVM最终参数

=表示未修改过, :=表示已修改过

方法3java  -XX:+PrintCommandLineFlags打印JVM默认的简单初始化参数

2.1 三大参数类型

参数类别说明示例
标配参数
  • -version
  • -help
  • java -showversion

java -version

java -help

X参数(掌握)
  • -Xint:解释执行
  • -Xcomp:第一次使用就编译成本地代码
  • -Xmixed:混合模式

java -Xint -version

java -Xcomp -version

java -Xmixed -version

XX参数(重点)
  • Boolean类型
    • 公式:-XX:+ 或者-某个属性 + 表示开启,-表示关闭
  • key-value类型
    • 公式:-XX:属性key=属性value
    • 不满意初始值,可以通过下列命令调整

java -XX:-PrintGCDetails

关闭了GC详情输出

java -XX:MetaspaceSize=21807104

查看Java元空间的值

问:如何查看JVM系统默认值?
答:一般使用jps和jinfo进行查看jps查看java的后台进程,jinfo查看正在运行的java序,
jinfo -flags *** 查看jvm的全部默认参数。jinfo -flag PrintGCDetails 进程ID 查看某个参数。

//运行一个HelloGC的java程序
public class HelloGC {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("hello GC");
        Thread.sleep(Integer.MAX_VALUE);
    }
}

jps -l

查看到HelloGC的进程号为:12608

jinfo -flag PrintGCDetails 12608

jinfo -flag 然后查看是否开启PrintGCDetails这个参数

-号表示关闭,即没有开启PrintGCDetails这个参数

问:如何开启PrintGCDetails参数?
答:step1、IDEA的 Run ---> Edit Configurations

然后,在VM Options中加入下面的代码,现在+号表示开启

-XX:+PrintGCDetails

step2、再次查看

jps -l
jinfo -flag PrintGCDetails 13540

得到:-XX:+PrintGCDetails,说明通过VM Options配置的JVM参数已经生效了。

2.2 九个调优参数

6个常用调优参数

-Xms初始化堆内存

默认为物理内存的1/64,等价于

-XX:initialHeapSize

java -xms 10m

-Xmx最大堆内存

默认为物理内存的1/4,等价于

-XX:MaxHeapSize

java -xmx 10m

-Xss单个线程栈的大小

默认为512K~1024K,等价于

-XX:ThreadStackSize

-Xmn设置年轻代大小
-XX:MetaspaceSize设置元空间大小
  • 元空间的本质和永久代类似,都是对JVM规范中方法区的实现,不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存,因此,默认情况下,元空间的大小仅受本地内存限制

  • -Xms10m -Xmx10m -XX:MetaspaceSize=1024m -XX:+PrintFlagsFinal

  • 但是默认的元空间大小:只有20多M

  • 为了防止在频繁的实例化对象的时候,让元空间出现OOM,因此可以把元空间设置的大一些

-XX:PrintGCDetails输出详细GC收集日志信息
  • GC
  • Full GC

3个垃圾回收相关的调优参数

-XX:SurvivorRatio调节新生代中 eden 和 S0、S1的空间比例

java -XX:SuriviorRatio=8

表示 Eden:S0:S1 = 8:1:1

-XX:NewRatio
(了解即可)
配置年轻代new 和老年代old 在堆结构的占比

java  -XX:NewRatio=2

新生代占1,老年代2,年轻代占整个堆的1/3

-XX:MaxTenuringThreshold设置垃圾最大年龄

java -XX:MaxTenuringThreshold=15

SurvivorTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区,部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认为15),最终如果还是存活,就存入老年代

这里就是调整这个次数的,默认是15,并且设置的值 在 0~15之间。

  • 如果设置为0的话,则年轻对象不经过Survivor区,直接进入老年代。对于年老代比较多的应用,可以提高效率。
  • 如果将此值设置为一个较大的值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概念

GC垃圾收集器

GC

GC在新生区

Full GC

Full GC大部分发生在养老区

 [名称: GC前内存占用 -> GC后内存占用 (该区内存总大小)]

当出现了老年代都扛不住的时候,就会出现OOM异常

三、垃圾回收器

GC算法和垃圾回收器的区别:GC算法是内存回收的方法论,垃圾收集器就是算法的落地实现

1、4种GC算法(引用计数 /复制拷贝/标记清除/标记整理)

  • 引用计数(几乎不用,无法解决循环引用的问题)
  • 复制拷贝(用于新生代)
  • 标记清除(用于老年代)
  • 标记整理(用于老年代)

2、4种垃圾回收器

2.1 主要4个(Serial / Parallel / CMS / G1)

UseSerialGC:

串行垃圾收集器

UseParallelGC:

并行垃圾收集器

UseConcMarkSweepGC:

并发标记清除(即CMS)

UseG1GC:

G1垃圾收集器

它为单线程环境设计且值使用一个线程进行垃圾收集,会暂停所有的用户线程,只有当垃圾回收完成时,才会重新唤醒主线程继续执行。所以不适合服务器环境多个垃圾收集线程并行工作,此时用户线程也是阻塞的,适用于科学计算 / 大数据处理等弱交互场景,也就是说Serial 和 Parallel其实是类似的,不过是多了几个线程进行垃圾收集,但是主线程都会被暂停,但是并行垃圾收集器处理时间,肯定比串行的垃圾收集器要更短用户线程和垃圾收集线程同时执行(不一定是并行,可能是交替执行),不需要停顿用户线程,互联网公司都在使用,适用于响应时间有要求的场景。并发是可以有交互的,也就是说可以一边进行收集,一边执行应用程序堆内存分割成不同区域,然后并发的进行垃圾回收

 2.2 其它3个(ParNew / ParallelOld / SerialOld)

UseParNewGC

年轻代的并行垃圾回收器

UseSerialOldGC

串行老年代垃圾收集器

(已经被移除)

UseParallelOldGC

老年代的并行垃圾回收器

 3、使用范围

新生代UserSerialGC、UserParallelGC、UserParNewGC
老年区UseConcMarkSweepGC、UseSerialOldGC、UseParallelOldGC
各区都能用UseG1GC

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

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

相关文章

深度学习pytorch实战三:VGG16图像分类篇自建数据集图像分类三类

1.自建数据集与划分训练集与测试集 2.模型相关知识 3.model.py——定义AlexNet网络模型 4.train.py——加载数据集并训练,训练集计算损失值loss,测试集计算accuracy,保存训练好的网络参数 5.predict.py——利用训练好的网络参数后&#xff0c…

【Taro开发】-文字展开收起组件(十五)

Taro小程序开发 系列文章的所有文章的目录 【Taro开发】-初始化项目(一) 【Taro开发】-路由传参及页面事件调用(二) 【Taro开发】-taro-ui(三) 【Taro开发】-带token网络请求封装(四&#x…

Sonar:Win10搭建SonarQube9.8服务

需求描述 公司为项目代码配置了Sonar检测,最初只是想调研在VSCode中同步远程检测的方法(现在请参考Sonar:VSCode配置SonarLint/SonarLint连接SonarQube);结果并没有找到靠谱的教程。。在度娘的信息海洋胡乱扑腾两天后…

Docker(七)--Docker数据卷管理及插件

文章目录一、Docker 数据卷管理1.bind mount2.docker managed volume3.bind mount与docker managed volume对比二、跨节点存储convoy卷插件一、Docker 数据卷管理 在实际使用过程中,我们需要把容器和数据进行隔离,因为容器在使用过程中可能随时要进行销…

C++:set和map(模拟实现)

目录 关联式容器 键值对 树形结构的关联式容器 set的介绍 set的使用 map的介绍 map的使用 multiset的介绍 multimap的介绍 底层结构 AVL树的概念 AVL树节点的定义 AVL树的旋转 左单旋 右单旋 先右单旋再左单旋 先左单旋再右单旋 模拟实现AVL树 红黑树 红黑树…

【C++】30h速成C++从入门到精通(stack、queuepriority_queue以及deque介绍)

stackstack的介绍https://cplusplus.com/reference/stack/stack/?kwstackstack是一种容器适配器,专门在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特…

详解一致性哈希算法

在单机系统中,所有的数据都存储在同一个服务器下,当数据量越来越多的时候,超过了单机存储容量的上限,就需要使用分布式存储系统,在分布式存储系统重,数据会被拆分到不同的存储服务下,减少单机服…

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 快速排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容,除其中使用到C引用外,全为C语言代…

【Linux】canal1.1.7同步MySQL8.0.3和Redis

目录前言一、MySQL8配置1. 修改my.cnf2. 重启mysql3. 建用户、授权二、Canal服务端配置1. 下载2. 修改配置3. 启动服务与验证三、Canal客户端编写1. yml配置文件添加canal服务端配置信息和Redis信息2. 配置pom文件3. 代码4. MySQL建表storage.storage5. 启动客户端与验证参考前…

中微8S6990使用过程的一些记录--GPIO初始化、定时器、PWM、ADC、休眠等外设的配置和使用

前言 最近把一款产品的代码从新唐MS51移植到了中微8S6990平台上,记录下移植过程遇到的各种情况。 目录前言定时器初始化、中断服务函数GPIO配置ADC模数转换初始化PWM初始化Main函数休眠的一些注意事项最后定时器初始化、中断服务函数 void TMR0_Config(void) {/*(…

keepalived+nginx 双机热备搭建

keepalivednginx 双机热备搭建一、准备工作1.1 准备两台centos7.91.2 nginx 与 keepalived软件 双机安装1.3 ip分配1.4 修改主机名1.5 关闭selinux(双机执行)1.6 修改hosts(双机执行)二、安装keepalived2.1 执行一下命令安装keepa…

MidiaPipe +stgcn(时空图卷积网络)实现人体姿态判断(单目标)

文章目录前言Midiapipe关键点检测stgcn 姿态评估效果前言 冒个泡,年少无知吹完的牛皮是要还的呀。 那么这里的话要做的一个东西就是一个人体的姿态判断,比如一个人是坐着还是站着还是摔倒了,如果摔倒了我们要做什么操作,之类的。…

【模型复现】-alexnet,nn.Sequential顺序结构构建网络

深度卷积神经网络(AlexNet) 在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面&#…

第五章 事务管理

1.事务概念 *什么是事务:事务是数据库操作最基本单元,逻辑上是一组操作,要么都成功,要么都失败 *事务的特性(ACID):原子性、隔离性、一致性、持久性 2.搭建事务操作环境 *模拟场景&#xff…

uart串口接收模块

uart串口接收模块 1、UART(异步串行接口) 串行通信:指利用一条数据线将资料一位位的顺序传输。   异步通信:以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然而在同一个字符的两个相邻位代…

【微信小程序】-- 页面事件 - 下拉刷新(二十五)

💌 所属专栏:【微信小程序开发教程】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…

高盐废水除钙镁的技术解析

高盐废水指含有机物和至少总溶解固体(totaldissolvedsolids,tds)的质量分数大于3.5%的废水,具有水量大,无机盐离子k、na、ca2、mg2、cl-、so42-等含量高,水质水量变化大,成分复杂,难生化降解等特…

2023年中职网络安全竞赛——CMS网站渗透解析

需求环境可私信博主 解析如下: CMS网站渗透 任务环境说明: 服务器场景:Server2206(关闭链接) 服务器场景操作系统:未知 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; Flag:8089

华为套件生态

华为套件生态前言蓝牙设备华为耳机华为鼠标智慧互联超级终端多屏协同远程访问文件共享华为电脑管家我的设备控制中心前言 华为的手机、平板、电脑、耳机、手环、手表等设备可以组成华为生态。以下分享一些生态体验。 蓝牙设备 华为耳机 快速连接 在手机/电脑附近打开华为耳…

里奇RIDGID管线定位仪/探测仪维修SR-20 SR-24 SR-60

美国里奇SeekTech SR-20管线定位仪对于初次使用定位仪的用户或经验丰富的用户,都同样可以轻易上手使用SR-20。SR-20提供许多设置和参数,使得大多数复杂的定位工作变得很容易。此外,当你在不复杂的环境下完成些基本的定位工作时,这…