说一下 JVM 有哪些垃圾回收器?如何选择垃圾收集器?notify()和notifyAll()有什么区别?

说一下 JVM 有哪些垃圾回收器?
如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。下图展示了
7 种作用于不同分代的收集器,其中用于回收新生代的收集器包括 Serial PraNew Parallel
Scavenge ,回收老年代的收集器包括 Serial Old Parallel Old CMS ,还有用于回收整个 Java 堆的
G1 收集器。不同收集器之间的连线表示它们可以搭配使用。 Serial 收集器(复制算法 ): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;
ParNew 收集器 ( 复制算法 ): 新生代收并行集器,实际上是 Serial 收集器的多线程版本,在多核
CPU 环境下有着比 Serial 更好的表现;
Parallel Scavenge 收集器 ( 复制算法 ): 新生代并行收集器,追求高吞吐量,高效利用 CPU 。吞
吐量 = 用户线程时间 /( 用户线程时间 +GC 线程时间 ) ,高吞吐量可以高效率的利用 CPU 时间,尽
快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;
Serial Old 收集器 ( 标记 - 整理算法 ): 老年代单线程收集器, Serial 收集器的老年代版本;
Parallel Old 收集器 ( 标记 - 整理算法 ) : 老年代并行收集器,吞吐量优先, Parallel Scavenge
集器的老年代版本;
CMS(Concurrent Mark Sweep) 收集器(标记 - 清除算法): 老年代并行收集器,以获取最短回
收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短 GC 回收停顿时间。
G1(Garbage First) 收集器 ( 标记 - 整理算法 ) Java 堆并行收集器, G1 收集器是 JDK1.7 提供的一
个新收集器, G1 收集器基于 标记 - 整理 算法实现,也就是说不会产生内存碎片。此外, G1
集器不同于之前的收集器的一个重要特点是: G1 回收的范围是整个 Java ( 包括新生代,老年
) ,而前六种收集器回收的范围仅限于新生代或老年代。
ZGC Z Garbage Collector )是一款由 Oracle 公司研发的,以低延迟为首要目标的一款垃圾收
集器。它是基于动态 Region 内存布局,(暂时)不设年龄分代,使用了读屏障、染色指针和内
存多重映射等技术来实现可并发的标记 - 整理算法的收集器。在 JDK 11 新加入,还在实验阶
段,主要特点是:回收 TB 级内存(最大 4T ),停顿时间不超过 10ms 优点 :低停顿,高吞吐
量, ZGC 收集过程中额外耗费的内存小。 缺点 :浮动垃圾
目前使用的非常少,真正普及还是需要写时间的。
新生代收集器 Serial ParNew Parallel Scavenge
老年代收集器 CMS Serial Old Parallel Old
整堆收集器 G1 ZGC 。
如何选择垃圾收集器?
1. 如果你的堆大小不是很大(比如 100MB ),选择串行收集器一般是效率最高的。
参数: - XX:+UseSerialGC
2. 如果你的应用运行在单核的机器上,或者你的虚拟机核数只有单核,选择串行收集器依然是合
适的,这时候启用一些并行收集器没有任何收益。
参数: - XX:+UseSerialGC
3. 如果你的应用是 吞吐量 优先的,并且对较长时间的停顿没有什么特别的要求。选择并行收集
器是比较好的。
参数: - XX:+UseParallelGC 4. 如果你的应用对响应时间要求较高,想要较少的停顿。甚至 1 秒的停顿都会引起大量的请求失
败,那么选择 G1 ZGC CMS 都是合理的。虽然这些收集器的 GC 停顿通常都比较短,但它
需要一些额外的资源去处理这些工作,通常吞吐量会低一些。
参数:
- XX:+UseConcMarkSweepGC
- XX:+UseG1GC
- XX:+UseZGC 等。
从上面这些出发点来看,我们平常的 Web 服务器,都是对响应性要求非常高的。选择性其实就集
中在 CMS G1 ZGC 上。而对于某些定时任务,使用并行收集器,是一个比较好的选择。
        
notify() notifyAll() 有什么区别?
notify 可能会导致死锁,而 notifyAll 则不会
任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行 synchronized 中的代码
使用 notifyall, 可以唤醒 所有处于 wait 状态的线程,使其重新进入锁的争夺队列中,而 notify 只能唤
醒一个。
wait() 应配合 while 循环使用,不应使用 if ,务必在 wait() 调用前后都检查条件,如果不满足,必须调
notify() 唤醒另外的线程来处理,自己继续 wait() 直至条件满足再往下执行。
notify() 是对 notifyAll() 的一个优化,但它有很精确的应用场景,并且要求正确使用。不然可能导致
死锁。正确的场景应该是 WaitSet 中等待的是相同的条件,唤醒任一个都能正确处理接下来的事
项,如果唤醒的线程无法正确处理,务必确保继续 notify() 下一个线程,并且自身需要重新回到
WaitSet 中。

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

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

相关文章

JSONObject.parseObject的使用-嵌套json

pom文件 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency>具体代码 import com.alibaba.fastjson.JSONObject;public class JsonLearn {public static …

PyCharm - Run Debug 程序安全执行步骤

PyCharm - Run & Debug 程序安全执行步骤 1. Run2. DebugReferences 1. Run right click -> Run ‘simulation_data_gene…’ or Ctrl Shift F10 2. Debug right click -> Debug ‘simulation_data_gene…’ 在一个 PyCharm 工程下&#xff0c;存在多个 Pytho…

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…

Python实现水雨情遥测终端串口通信

Python实现水雨情遥测终端的串口通信&#xff0c;可以使用pySerial库。pySerial是一个Python串行端口通信库&#xff0c;它可以让你简单地与串行设备进行通信。以下是一个基本的示例&#xff0c;说明如何使用pySerial库进行串口通信&#xff1a; 首先&#xff0c;你需要安装py…

【PyQt】13-对话框

文章目录 前言一、知识储备二、详细展开2.1 通用对话框-QDialog2.1 消息类型对话框-QMessageBox运行结果 2.2 输入对话框 QInputDilog运行结果 2.3 字体对话框-QFontDialog运行结果 2.4 颜色对话框运行结果 2.5 文件对话框运行结果 总结 前言 1、四种形式的对话框。 2、警告框…

深入理解 Vue3 中的 setup 函数

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

搞不明白这4类车,别去自驾游

文 | AUTO芯球 作者 | 太2 春天要来了 又可以去浪了 喜欢自驾的朋友憋不住了吧&#xff0c; 鄙人不才全国各地走过&#xff0c;各种车型也大致开过。 那么根据我这几年的自驾经历 来跟大家聊一聊我觉得比较方便好用的自驾车。 第一类&#xff0c;城市SUV 宝马X&#xff…

vue框架-vue-cli

vue-cli Vue CLI是一个官方的脚手架工具,用于快速搭建基于Vue.js的项目。Vue CLI提供了一整套可配置的脚手架,可以帮助开发人员快速构建现代化的Web应用程序。 Vue CLI通过提供预先配置好的Webpack模板和插件,使得开发人员可以在不需要手动编写Webpack配置的情况下快速创建…

【Docker】docker安装

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Ubuntu安装docker 1、查看操作系统和CPU架构 2、卸载docker 3、配置docker下载源 4、安装docker 5、解决报错…

【STM32 物联网】AT指令与TCP,发送与接收数据

文章目录 前言一、连接TCP服务器1.1 配置Wifi模式1.2 连接路由器1.3 查询ESP8266设备IP地址1.4 连接TCP服务器 二、向服务器接收数据和发送数据2.1 发送数据2.2 接收数据 总结 前言 随着物联网&#xff08;IoT&#xff09;技术的迅速发展&#xff0c;越来越多的设备和系统开始…

【开源】C++ 周期任务调度的思想和实现

​ 今天调休&#xff0c;抓住年假的最后一天&#xff0c;将构思多日适合将并行任务串行执行的框架实现出来。 核心思想&#xff1a; 将各个独立的功能模块作为周期性的任务。在主循环集中调度所有任务&#xff0c;让各个功能模块依次有处理事项的机会。如果处理事项较为耗时&…

BES 平台 SDK之串口指令

本文章是基于BES2700 芯片&#xff0c;其他BESxxx 芯片可做参考&#xff0c;如有不当之处&#xff0c;欢迎评论区留言指出。仅供参考学习用&#xff01; 上位机下发格式&#xff1a; 格式一&#xff1a;[A,B] 格式二&#xff1a;A:B 固定格式&#xff1a;auto_test&#xff1a…

政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法

如果小伙伴第一次看到这篇文章&#xff0c;可以先浏览一下我这个系列的上一篇文章&#xff1a; 政安晨&#xff1a;【完全零基础】认知人工智能&#xff08;一&#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…

阿里云服务器CPU内存配置怎么选择够用?

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

技能下载中:Sora视频让机器人秒学任何技艺!

引言 在机器人成为平凡工匠和前沿先驱的时代&#xff0c;我们正站在新黎明的边缘。本文将探讨斯坦福大学的通用操作接口&#xff08;UMI&#xff09;及其与OpenAI的Sora如何共同推进机器人技术&#xff0c;开创未来学习的新纪元。 正文 斯坦福的通用操作接口&#xff08;UMI…

WildCard:一个因太好用而被迫暂停服务的虚拟信用卡平台,魅力何在?

如果你需要使用Wildcard开通GPT4、Midjourney或是Only方式的话&#xff0c;请点击&#xff1a;WildCard使用教程 参考文章链接&#xff1a;WildCard&#xff1a;一个因太好用而被迫暂停服务的虚拟信用卡平台&#xff0c;魅力何在&#xff1f; 1、Wildcard用户数量激增&#x…

Vite之对CSS的处理方式及使用

Vite之对CSS的处理方式及使用 文章目录 Vite之对CSS的处理方式及使用1. 直接对CSS处理2. 使用css预处理器less 1. 直接对CSS处理 可直接导入css进行使用&#xff0c;而不需要任何配置 定义样式文件&#xff1a;myStyle.css body {background-clor:red }导入css文件 import …

Windows 编译 yangfengzzz/fluid-engine-OpenVDB

我想将 OpenVDB 接入 doyubkim 的流体引擎 https://github.com/doyubkim/fluid-engine-dev 然后搜到已经有人做过这件事了 https://github.com/yangfengzzz/fluid-engine-OpenVDB Windows 编译 yangfengzzz/fluid-engine-OpenVDB 但是我是 windows&#xff0c;所以想要编译…

ubuntu22.04-cmake-添加动态库-静态库-添加头文件夹所在位置-管理员启动

文章目录 1.引用库命令-target_link_libraries2.命令行添加头文件夹和库文件夹所在位置3.添加头文件目录-include_directories4.target_include_directories5.生成库-add_library6.静态库-共享库7.管理员任务管理器1.引用库命令-target_link_libraries 作用 指定链接给定目标和…

MySQL系列之索引入门(下)

前言 通过上文&#xff0c;我想各位盆友已熟悉MySQL的索引分类及其含义&#xff0c;那么如何合理的使用呢&#xff1f; 请继续围观此文&#xff0c;一探究竟&#xff01; 一、创建索引 首先&#xff0c;我们一起学习索引是如何创建的&#xff0c;又有哪些方式。 1. create t…