黑马JVM总结(十九)

news2024/11/16 8:24:12

(1)GC调优1

通过官网查看查看JVM的参数: 

 

可以使用java命令查看当前环境下的虚拟机参数:

学会使用一些工具如前面学的jmap ,jconsole等等工具

(2)GC调优2

垃圾回收调优只是众多调优中的一个方向,想要你的应用程序有更多的提升,要从各个领域进行分析进行调优,不光是GC这块,只是GC这块影响比较明显,可能影响你的网络延迟,因为一旦发生了Stop the World你的应用程序响应时间就会变长 ,下面的也是一种调优的方向:

 

对垃圾回收这块确定的调优 目标:需要确定自己的应用程序是用来干什么的,到底是做一些科学运算,还是做互联网项目,如果是科学运算追求的是高吞吐量,延长一点响应时间不是紧要的,这种情况下,就要追求一种高吞吐量的垃圾回收器,如果做的是互联网项目,那么响应时间呢,就是一个非常重要的指标了,因为每次的垃圾回收呢延长了你的响应时间,那么就会给用户造成不好的体验 。确定目标后选择合适的垃圾回收器

高吞吐量的垃圾回收器没有太多的选择只有一个ParallelGC

如果是低延迟响应时间优先可以选择CMS、G1、ZGC

jdk9中使用的是G1,它比CMS更好,相当于集成了CMS和ParallelGC之长特别适合管理超大的堆内存,可以做到低延迟,也可以想ParallelGC的吞吐量,确定是以吞吐量为目标或者响应时间为目标

ZGC是jdk12提出的一个体验的垃圾回收

还有一种叫做Zing的垃圾回收器,它对外宣称是0停顿,几乎没有Stop the World的时间,可以管理超大的内存

(3)GC调优3

在学jdbc的时候一下子查询出所有表的数据,把大量的数据加载到堆内存里 ,这样的堆内存在大,也经受不了多个这样的sql语句把大量的数据加载到堆内存里,像这种应该加一个limit限制一下返回的记录总数

另外一点数据是否臃肿:加载了一些不必要的数据比如说查询用户,来一个表连接把用户的信息全部查询出来,比如用户得详情,用户订单等等,数据查询出来以后不一定都用得上,在一次响应里只用到了一部分数据而不是所有,很多不是要什么查什么,而是一次性的把数据都查询出来,就可能造成内存得浪费

对象的大小:包装类比基本类型占用的大,这样呢可以从一方面来减少GC的压力,这样的对象呢极少成多,能节约的内存是相当可观的

存在内存泄露:错误的做法是定义了一个静态的Map变量,然后不断的想map中存放对象,这样呢就会造成内存可能溢出,最后可能发生GC,甚至内存溢出

像这种长时间存活的对象建议用可以使用软弱引用,软弱引用在内存吃力时做一下回收

像这种类似缓存的数据不建议使用java中的实现,因为毕竟不是专业做缓存的,可以使用第三方的缓存实现像Redis,他们都会考虑对象的过期,第三方的缓存实现不会造成对java堆的压力,

(4)GC调优_新生代1

当new一个对象时首先会在伊甸园中分配买这个分配速度是非常非常快的,每个线程呢都会在伊甸园中分配一个私有的区域,叫做TLAB这个区域,当new一个对象时首先在TLAB中看有没有个内存可以分配,有的话在这个区域呢做一个分配,因为我们对象的分配也有一个线程安全的问题比如说线程1用这个内存,在分配还没有结束时线程2也要这个内存,机会造成问题,因此需要做一个线程的并发安全保护,能不能减少线程对内存分配的一个冲突呢?TLAB线程局部缓冲区,它可以让每个线程用自己私有这块伊甸园内存做对象的分配,这样呢即是多个线程创建对象时也不会造成对内存的一个干扰 

死亡对象的回收代价为0,我们知道新生代垃圾回收采用的是复制算法,复制算法的特点是我要把伊甸园,幸存区From中的幸存对象复制到幸存区To中去,复制完之后呢伊甸园的的内存都释放出来了因此呢死亡对象回收代价0

新生代的幸存对象很少又采用复制算法导致Minar时间很短

(5)GC调优_新生代2

怎么做新生代的垃圾调优呢?不就是把新生代调大一些嘛?但是调大情况下会出现一些问题:

太小容易触发Minar GC 太大了老年代不足容易触发Full GC时间更长

 

(6)GC调优_新生代3

尽可能的调大新生代:我们知道复制做占用的时间也是较多,因为涉及到占用内存块的移动,更新其他引用块的地址这个更耗时一些,但是因为新生代只有 少量的对象存活,那么复制时间也相对较 短,而标记时间较复制时间显得不是那么重要了,新生代调大主要的耗费还是在复制上,那么新生代真的很大也不会有明显的下降

一般设置下面的大小:一次响应产生的对象*并发量 

(7)GC调优_新生代_幸存区

幸存区的对象:下面两种

当前存活的对象:声明周期较短,下一次垃圾回收就被回收掉了,但是现在还在使用它不能回收 ,暂时不能回收

需要晋升的对象:将来可能被晋升的对象,大家都在引用它,但是它的寿命还不够没有达到阈值,暂时存在幸存区

打下需要融那这两类对象。

幸存区如果很小那么jvm会动态调整晋升的阈值 ,也许有些对象寿命还不够轮不到它晋升,但是由于幸存区的内存太少,那么我们会提前把幸存区的对象晋升到老年代中去 ,比如这个存活时间较短的对象,晋升了那么就以为这只有等到老年代空间不足时才能回收,变相的延长了对象的存活时间

我们希望幸存时间短的对象留在幸存区里面,下次垃圾回收把它回收掉,

另一方面老长时间存活的对象,应该被尽快被提升,可以设置晋升阈值

 

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

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

相关文章

基于微信小程序的电动车智能充电系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍:✌…

THREE.JS 3D模型服务器报404问题(VUE fbx文件在本地能显示 服务器上不显示报404)

问题: 作为新手,新建立的threeJS模型,本地运行模型是可以显示的 ,但服务器模型却报404 写法: fbxloader("TR7007Q").then((tree) > { tree.position.set(-1080, -20, 0);this.$refs.draw.scene.add(tree…

编辑.htaccess文件执行任意代码(CVE-2022-25578)

简介 CVE-2022-25578是Taocms v3.0.2中存在的一个安全漏洞,该漏洞允许攻击者通过任意编辑.htaccess文件来执行代码注入攻击。 Taocms是一个完善支持多数据库(Sqlite/Mysql)的CMS网站内容管理系统,是国内最小且功能完善的基于php…

DM/达梦数据库查询或更新某一列中多个字典码对应内容

准备工作(建表、插入数据) 1、建立表格:学生-学习科目表student_study 注意:科目kemu列内容是字典码,需要更换成对应内容。 CREATE TABLE "TEST"."STUDENT_STUDY" ( "NAME" VARCHAR(2…

技术分享| anyRTC音视频混流技术解析

一,简介 在视频通讯场景中,比如会议、直播等经常能看到图像合成的场景。图像合成是在指定的一块画面区域,在这个区域内,按画面的位置(坐标)布局,将区域中的每个视频画面的像素混合计算成一个像素(RGB&…

深度学习中的激活函数 – 完整概述

1.什么是激活函数? 生物神经网络启发了人工神经网络的发展。然而,人工神经网络甚至不能近似代表大脑的工作方式。在我们知道为什么在人工神经网络中使用激活函数之前,了解生物神经网络中激活函数的相关性仍然很有用。 典型的神经元具有由细胞体、向其他神经元发送信息的轴…

源码:TMS FlexCel Studio for .NET 7.19

TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成,适用于 .NET、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Windows Phone 和 Windows Store 功能概述 使用 FlexCel Studio for .NET 创建可动态快速读写 Excel 文件的…

SQLite 3.43 发布,性能大提升!

前言 SQLite是一种被广泛运用的嵌入式关系型数据库管理系统,最新发布的SQLite 3.43版本带来了一个重要的改进,大幅提升了对JSON数据的处理性能,达到了之前的两倍。 主要更新 添加对 Contentless-Delete FTS5 索引的支持。这是 FTS5 全文搜索…

Go 常用命令介绍

Go 常用命令 文章目录 Go 常用命令一、Go 常用命令1.1 go build1.1.1 指定输出目录1.1.2 常用环境变量设置编译操作系统和 CPU 架构1.1.3 查看支持的操作系统和CPU架构 1.2 go test1.3 go vet1.4 go clean1.5 go fmt1.6 go get1.7 go install1.8 go tool1.9 go generate1.10 go…

iOS——KVC(键值编码)

键值编码(KVC) KVC(Key Value Coding)是一种允许以字符串形式间接操作对象属性的方式。 最基本的KVC是由NSKeyValueCoding协议提供支持,最基本的操作属性如下: setValue: 属性值 forKey: 属性名&#xff…

Flink1.14 Source概念入门讲解与源码解析

目录 Flink Source概念 Source Source源码 getBoundedness() createReader(SourceReaderContext readerContext) createEnumerator(SplitEnumeratorContext enumContext) SplitEnumerator restoreEnumerator(SplitEnumeratorContext enumContext, EnumChkT checkpoint) …

使用Selenium进行网页登录和会话管理

随着互联网的快速发展,网页登录和会话管理是许多网站和应用程序的基本功能。通过网页登录,用户可以访问个人账户、购物车订单、历史记录等个性化信息。为了提高用户体验和效率,自动化登录和会话管理成为一个重要的需求。而Selenium作为一种强…

信创办公–基于WPS的EXCEL最佳实践系列 (限制可录入内容)

信创办公–基于WPS的EXCEL最佳实践系列 (限制可录入内容) 目录 应用背景操作过程1、数据有效性(支出证明单)2、如何完成数据有效性的使用(差旅报销申请表)3、清除数据验证4、利用圈释无效数据,验…

Docker容器中的SSH免密登录

简介:在日常的开发和测试环境中经常需要创建和管理Docker容器。有时,出于调试或管理的目的,可能需要SSH到容器内部。本文将介绍如何创建一个Docker容器,它在启动时自动运行SSH服务,并支持免密登录。 历史攻略&#xf…

在github上设置不同分支,方便回滚

在github上设置不同分支,方便回滚 步骤可能出现的问题couldnt find remote ref gpuVersion1. 确保您处于正确的分支2. 添加并提交更改(如果还未进行)3. 推送本地分支到远程仓库4. 验证操作 步骤 之前在github上上传了一个项目代码&#xff0c…

用Win10自带画图3D抠图

文章目录 一、打开“画图3D”二、插入图片三、抠图操作四、保存抠图 一、打开“画图3D” 在搜索框输入“画图3D” 选择彩色水滴图标的软件 二、插入图片 选择“新建” 导航栏“菜单”–>“插入”,选择要扣的图片。(我选择了一张自己随意画的图片…

【动态规划刷题 17】回文子串 最长回文子串

647. 回文子串 链接: 647. 回文子串 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由…

启动 React APP 后经历了哪些过程

本文作者为 360 奇舞团前端开发工程师 前言 本文中使用的React版本为18,在摘取代码的过程中删减了部分代码,具体以源代码为准。 在React 18里,通过ReactDOM.createRoot创建根节点。并且通过调用原型链上的render来渲染。 本文主要是从以下两个…

Python函数绘图与高等代数互融实例(五): 则线图综合案例

Python函数绘图与高等代数互融实例(一):正弦函数与余弦函数 Python函数绘图与高等代数互融实例(二):闪点函数 Python函数绘图与高等代数互融实例(三):设置X|Y轴|网格线 Python函数绘图与高等代数互融实例(四):设置X|Y轴参考线|参考区域 Python函数绘图与高等代数互融实例(五…

iOS应用程序数据保护:如何保护iOS应用程序中的图片、资源和敏感数据

目录 转载:怎么保护苹果手机移动应用程序ipa中文件安全? 前言 1. 对敏感文件进行文件名称混淆 2. 更改文件的MD5值 3. 增加不可见水印处理 3. 对html,js,css等资源进行压缩 5. 删除可执行文件中的调试信息…