互联网三高-高性能之JVM调优

1 运行时数据区

        JVM运行时数据区是Java虚拟机管理的内存核心模块,主要分为线程共享和线程私有两部分。

        (1)线程私有

                        ① 程序计数器:存储当前线程执行字节码指令的地址,用于分支、循环、异常处理等流程控制‌

                        ② 虚拟机栈:存储方法调用的栈帧,包含局部变量表、操作数栈、动态链接、方法返回地址等‌

                        ③ 本地方法栈:服务于Native方法(如C/C++实现的方法)的执行,结构与虚拟机栈类似‌

        (2)线程共享

                        ① 堆:存储对象实例和数组,是垃圾回收(GC)的主要区域‌

                        ② 方法区:存储类元信息(如类名、字段、方法)、运行时常量池、静态变量、即时编译后的代码等‌(JDK 8及之后:元空间(MetaSpace),使用本地内存)

2 三大GC算法

        2.1 标记-复制算法(年轻代)

                原理:将内存分为两块(如Eden区和Survivor区),每次仅使用一块;存活对象复制到未使用的内存块,原内存块整体回收‌

                优点:无内存碎片,对象分配效率高‌

                缺点:需要一块内存;复制对象过程比较耗时

        2.2 标记-清除算法

                原理:从GC Roots出发,标记所有可达对象(标记);回收未被标记的对象即垃圾(清除)‌

                优点:实现简单,无需移动对象

                缺点:有内存碎片问题,可能导致后续大对象分配失败‌

        2.3 标记-整理算法

                原理:从GC Roots出发,标记所有可达对象(标记);将存活对象向内存一端移动,清理边界外的空间‌(整理)

                优点:避免内存碎片,支持连续内存分配‌

                缺点:整理过程需STW;复制对象过程比较耗时

        无论什么GC回收算法,第一阶段都是标记,根据根可达性分析,从GC Roots出发开始遍历访问,找出有效对象。

        2.4 标记算法—三色标记法

                三色

                        ① 白色:尚未遍历过

                        ② 黑色:本对象已经遍历过,而且本对象引用的其他对象也全部遍历过

                        ③ 灰色:本对象已经遍历过,而且本对象引用的其他对象尚未全部遍历完

                基本流程

                        ① 初始阶段:所有对象都在【白色集合】中

                        ② 将GC Roots直接引用的对象挪到【灰色集合】中,并将其从【白色集合】中去掉

                        ③ 从【灰色集合】中获取对象,将本对象引用的其他对象全部挪到【灰色集合】中,并从【白色集合】中去掉,将本对象挪到黑色集合中

                        ④ 重复 步骤③ 操作,直至【灰色集合】为空时结束

                        ⑤ 结束后,仍在【白色集合】中的对象就是垃圾,可以回收

说明:图片引用自 https://zhuanlan.zhihu.com/p/664929804?utm_id=0

3 常见垃圾收集器

        3.1 新生代(标记-复制算法)

                Serial New:单线程收集器

                ParNew:并行收集器(Serial多线程版本)

                Parallel Scavenge:并行回收,追求高吞吐量,高效利用CPU

        3.2 老年代

                Serial Old:单线程收集器(标记-整理算法)

                Parallel Old:并行收集器(标记-整理算法)

                CMS:以‌低停顿‌为目标,分阶段并发执行<初始标记、并发标记、重新标记、并发清除>(标记-整理算法)

                        (1)步骤:

                                ① 初始标记:SWT,仅标记GC Roots能直接关联的对象,速度比较快

                                ② 并发标记:可以和用户线程并发执行,通过GC Roots可达性算法标记所有可达对象

                                ③ 重新标记:STW,对并发标记阶段产生的垃圾对象进行标记修正,以及更新逃逸对象

                                ④ 并发清除:可以和用户线程并发执行,清除可回收对象

                        (2)优点:支持并发收集,低停顿,能保证短时间内执行完成,达到近似并发目的

                        (3)缺点:

                                ① 无法清理浮动对象

                                ② 使用标记-清除算法,会产生大量内存碎片

                                ③ 必须要在老年代用尽之前完成垃圾回收,否则会触发担保机制,退化成Serial Old收集器来进行垃圾回收,效率低下

                        (4)使用场景:老年代垃圾回收,需低停顿的交互式应用;堆内存不宜过大(避免并发标记耗时过长)‌

                        (5)配置参数

                                -XX:+UseConcMarkSweepGC:启用CMS收集器‌

                                -XX:CMSInitiatingOccupancyFraction:设置触发CMS回收的老年代使用率阈值(默认92%)‌

                                -XX:+CMSParallelRemarkEnabled:启用并行重新标记(减少重新标记时间)‌

        3.3 不分代

                G1:将堆划分为多个大小相等的Region,采用‌标记-整理算法‌(全局)和‌标记-复制算法‌(局部)

                        (1)原理:分治法,将堆分成若干个等大的区域Region(默认2048个,每个1-32MB)

                        (2)优点: ‌低停顿;基于标记-整理算法无内存碎片;大堆友好‌,支持TB级堆内存

                        (3)缺点:

                                ① 内存占用‌:维护RSet(记忆集)和CSet(回收集)需额外内存‌

                                ② CPU消耗‌:并发标记和RSet更新增加CPU开销‌

                                ③ 复杂调优‌:需平衡停顿时间、吞吐量和Region大小等参数‌

                        (4)使用场景:大内存服务端应用;低延迟需求‌;JDK 9+默认收集器‌

                        (5)配置参数

                                -XX:+UseG1GC:启用G1收集器‌

                                -XX:MaxGCPauseMillis:设置最大GC停顿时间目标(默认200ms)‌

                                -XX:G1HeapRegionSize:指定Region大小(需为2的幂)‌

                                -XX:G1MixedGCLiveThresholdPercent:设置混合GC中Region存活对象占比阈值(默认85%,高于此值不回收)‌

                ZGC:基于‌并发标记-整理算法‌,使用染色指针和读屏障技术,实现亚毫秒级停顿(支持TB级堆内存管理)

4 JDK各版本默认使用垃圾收集器

        ‌≤1.5‌    Serial + Serial Old

        1.8‌    Parallel Scavenge+ Parallel Old

        9~21‌    G1

        11/17/21‌    新增ZGC/Shenandoah/Epsilon

通过命令行查看当前JDK默认垃圾收集器
java -XX:+PrintCommandLineFlags -version

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

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

相关文章

浅谈StarRocks 常见问题解析

StarRocks数据库作为高性能分布式分析数据库&#xff0c;其常见问题及解决方案涵盖环境部署、数据操作、系统稳定性、安全管控及生态集成五大核心领域&#xff0c;需确保Linux系统环境、依赖库及环境变量配置严格符合官方要求以避免节点启动失败&#xff0c;数据导入需遵循格式…

P1332 血色先锋队(BFS)

题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&#xff0c;以抵…

大文件上传之断点续传实现方案与原理详解

一、实现原理 文件分块&#xff1a;将大文件切割为固定大小的块&#xff08;如5MB&#xff09; 进度记录&#xff1a;持久化存储已上传分块信息 续传能力&#xff1a;上传中断后根据记录继续上传未完成块 块校验机制&#xff1a;通过哈希值验证块完整性 合并策略&#xff1a;所…

【动手学深度学习】卷积神经网络(CNN)入门

【动手学深度学习】卷积神经网络&#xff08;CNN&#xff09;入门 1&#xff0c;卷积神经网络简介2&#xff0c;卷积层2.1&#xff0c;互相关运算原理2.2&#xff0c;互相关运算实现2.3&#xff0c;实现卷积层 3&#xff0c;卷积层的简单应用&#xff1a;边缘检测3.1&#xff0…

Opencv计算机视觉编程攻略-第十一节 三维重建

此处重点讨论在特定条件下&#xff0c;重建场景的三维结构和相机的三维姿态的一些应用实现。下面是完整投影公式最通用的表示方式。 在上述公式中&#xff0c;可以了解到&#xff0c;真实物体转为平面之后&#xff0c;s系数丢失了&#xff0c;因而无法会的三维坐标&#xff0c;…

大厂不再招测试?软件测试左移开发合理吗?

&#x1f449;目录 1 软件测试发展史 2 测试左移&#xff08;Testing shift left&#xff09; 3 测试右移&#xff08;Testing shift right&#xff09; 4 自动化测试 VS 测试自动化 5 来自 EX 测试的寄语 最近两年&#xff0c;互联网大厂的招聘中&#xff0c;测试工程师岗位似…

windows10下PointNet官方代码Pytorch实现

PointNet模型运行 1.下载源码并安装环境 GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/gh_mirrors/po/pointnet.pyto…

git pull 和 git fetch

关于 git pull 和 git fetch 的区别 1. git fetch 作用&#xff1a;从远程仓库获取最新的分支信息和提交记录&#xff0c;但不会自动合并或修改当前工作目录中的内容。特点&#xff1a; 它只是更新本地的远程分支引用&#xff08;例如 remotes/origin/suyuhan&#xff09;&am…

前端开发中的单引号(‘ ‘)、双引号( )和反引号( `)使用

前端开发中的单引号&#xff08;’ &#xff09;、双引号&#xff08;" "&#xff09;和反引号&#xff08; &#xff09;使用 在前端开发中&#xff0c;单引号&#xff08;’ &#xff09;、双引号&#xff08;" "&#xff09;和反引号&#xff08; &…

程序化广告行业(69/89):DMP与PCP系统核心功能剖析

程序化广告行业&#xff08;69/89&#xff09;&#xff1a;DMP与PCP系统核心功能剖析 在数字化营销浪潮中&#xff0c;程序化广告已成为企业精准触达目标受众的关键手段。作为行业探索者&#xff0c;我深知其中知识的繁杂与重要性。一直以来&#xff0c;都希望能和大家一同学习…

Amodal3R ,南洋理工推出的 3D 生成模型

Amodal3R 是一款先进的条件式 3D 生成模型&#xff0c;能够从部分可见的 2D 物体图像中推断并重建完整的 3D 结构与外观。该模型建立在基础的 3D 生成模型 TRELLIS 之上&#xff0c;通过引入掩码加权多头交叉注意力机制与遮挡感知注意力层&#xff0c;利用遮挡先验知识优化重建…

LLM面试题八

推荐算法工程师面试题 二分类的分类损失函数&#xff1f; 二分类的分类损失函数一般采用交叉熵(Cross Entropy)损失函数&#xff0c;即CE损失函数。二分类问题的CE损失函数可以写成&#xff1a;其中&#xff0c;y是真实标签&#xff0c;p是预测标签&#xff0c;取值为0或1。 …

30天学Java第7天——IO流

概述 基本概念 输入流&#xff1a;从硬盘到内存。&#xff08;输入又叫做 读 read&#xff09;输出流&#xff1a;从内存到硬盘。&#xff08;输出又叫做 写 write&#xff09;字节流&#xff1a;一次读取一个字节。适合非文本数据&#xff0c;它是万能的&#xff0c;啥都能读…

面试可能会遇到的问题回答(嵌入式软件开发部分)

写在前面&#xff1a; 博主也是刚入社会的小牛马&#xff0c;如果下面有写的不好或者写错的地方欢迎大家指出~ 一、四大件基础知识 1、计算机组成原理 &#xff08;1&#xff09;简单介绍一下中断是什么。 ①回答&#xff1a; ②难度系数&#xff1a;★★ ③难点分析&…

层归一化详解及在 Stable Diffusion 中的应用分析

在深度学习中&#xff0c;归一化&#xff08;Normalization&#xff09;技术被广泛用于提升模型训练的稳定性和收敛速度。本文将详细介绍几种常见的归一化方式&#xff0c;并重点分析它们在 Stable Diffusion 模型中的实际使用场景。 一、常见的归一化技术 名称归一化维度应用…

深入理解Socket编程:构建简单的计算器服务器

一、Socket通信基础 1. Socket通信基本流程 服务器端流程&#xff1a; 创建Socket (socket()) 绑定地址和端口 (bind()) 监听连接 (listen()) 接受连接 (accept()) 数据通信 (read()/write()) 关闭连接 (close()) 客户端流程&#xff1a; 创建Socket (socket()) 连接…

Redis-x64-3.2.100.msi : Windows 安装包(MSI 格式)安装步骤

Redis-x64-3.2.100.msi 是 Redis 的 Windows 安装包&#xff08;MSI 格式&#xff09;&#xff0c;适用于 64 位系统。 在由于一些环境需要低版本的Redis的安装包。 Redis-x64-3.2.100.msi 安装包下载&#xff1a;https://pan.quark.cn/s/cc4d38262a15 Redis 是一个开源的 内…

4.7正则表达式

1.字符匹配 一般字符匹配自身. 匹配任意字符(换行符\n除外),一个点占一位\转义字符&#xff0c;使其后一个字符改变原来的意思(\.就是.)[......]字符集,对应的位置可以是字符集中的任意字符.字符集中的字符可以逐个列出,也可以给出范围如[abc]或[a-c] [^abc] 表示取反&#xf…

Fortran 中读取 MATLAB 生成的数据文件

在 Fortran 中读取 MATLAB 生成的数据文件&#xff0c;可以通过以下几种方法实现&#xff0c;包括使用开源工具和手动解析&#xff1a; 1. 使用开源工具&#xff1a;MATFOR MATFOR 是一个商业/开源混合工具&#xff08;部分功能免费&#xff09;&#xff0c;提供 Fortran 与 M…

压测工具开发实战篇(四)——client子窗口功能

你好&#xff0c;我是安然无虞。 文章目录 树控件添加文件补充学习: 函数定义中循环体里的局部变量补充学习: 动态添加对象属性 刷新文件上下文菜单 (右键菜单)实现右键菜单功能 编辑节点文本 在学习本篇文章之前, 建议先看一下上篇介绍MDI子窗口的文章: 压测工具开发实战篇(三…