黑马JVM总结(十九)

(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.rhkb.cn/news/139197.html

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

相关文章

聊聊wireshark的进阶使用功能 | 京东云技术团队

1. 前言 emmm,说起网络知识学习肯定离不来wireshark工具,这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器,平时更多的只是停留在初步的使用阶段。也是利用部门内部的网络兴趣小组…

关于分布式一致性

一致性(consistency) 说到一致性,我们可能最先想到的数据库里的事务 这里的讨论的是分布式的一致性,事务就简化一下,只考虑Read/Write 先列举一下事务的种类: 单机的事务:多个复杂事务发生在一…

【异常报错】must call Vue.use(Vuex)

这个错误应该是在创建Vuex中出现的 把你main.js中的Vue.use(Vuex)写到store中,这里我的store/index.js中,即完美解决 其实仔细想想也可以发现,import就把整个文件给引入了,而index.js中有创建Store的实例,而在这时我们还没有Vue.…

Redis集群架构搭建——主从、哨兵、集群

上一篇文章Ubuntu上通过源码方式安装Redis已经介绍了如何安装redis,在这篇文章中,将会教大家搭建Redis的几种高可用的架构:主从架构、哨兵集群、Cluster集群。 本篇文章使用的redis版本为6.2.13,不同版本的配置可能有略微的区别&a…

腾讯云微服务平台 TSF 异地多活单元化能力重磅升级

导语 2023腾讯全球数字生态大会已于9月7-8日完美落幕,40专场活动展示了腾讯最新的前沿技术、核心产品、解决方案。 微服务与消息队列专场,腾讯云微服务平台 TSF 产品经理张桢带来了《腾讯云微服务平台 TSF 异地多活单元化能力重磅升级》的精彩演讲。本…

Centos7部署单机版MongoDB

目录 Centos7部署单机版MongoDBMongoDB介绍数据模型索引分布式高可用性查询语言驱动和社区用途缺点 下载并解压安装包创建相关文件夹和文件编辑mongod.conf文件启动mongodb创建管理员用户终止MongoDB服务配置自启动服务关闭SELinux编辑自启动服务文件mongodb服务命令 Centos7部…

iOS17.0.2更新修复iPhone 15系列机型数据迁移问题,附新机快速数据迁移办法!

iPhone 15 系列机型已于今日正式发售,为解决iPhone15这些机型出现的数据迁移问题,苹果紧急发布了 iOS 17.0.2 更新,内部版本号为 21A350。 需要注意的是, iOS 17.0.2 更新仅适用于 iPhone 15、iPhone 15 Plus、iPhone 15 Pro 和 …

QT-day2

完善登录框 点击登录按钮后,判断账号(admin)和密码(123456)是否一致,如果匹配失败,则弹出错误对话框,文本内容“账号密码不匹配,是否重新登录”,给定两个按钮…

Android 启动优化案例:WebView非预期初始化排查

去年年底做启动优化时,有个比较好玩的 case 给大家分享下,希望大家能从我的分享里 get 到我在做一些问题排查修复时是怎么看上去又low又土又高效的。 1. 现象 在我们使用 Perfetto 进行app 启动过程性能观测时,在 UI 线程发现了一段 几十毫…

ruoyi框架修改左侧菜单样式

菜单效果 ruoyi前端框架左侧的菜单很丑,我们需要修改一下样式,下面直接看效果。 修改代码 1、sidebar.scss .el-menu-item, .el-submenu__title {overflow: hidden !important;text-overflow: ellipsis !important;white-space: nowrap !important;//…

Docker核心原理与实操

第一章、Docker基本概念 1、概念:Docker是一种容器技术,可以解决软件跨环境迁移问题。 2、实现原理:是一个分层复用的文件系统;每一层都是一个独立的软件; …

Linux中创建用户要自己设置密码

因为不知道Linux默认设置的密码,没办法接下来愉快的使用。如下: 而想要新建Linux用户密码,请您执行以下步骤: . 1.打开终端并以root身份登录; 2.输入命令“useradd username",其中username为您新建的用户名; 3.使用命令“passwd usernam…

SDXL prompt 笔记

模型 模型有两个,分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图,refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024&#xf…

Springboot2 Pandas Pyecharts 量子科技专利课程设计大作业

数据集介绍 1.背景 根据《中国科学:信息科学》期刊上的一篇文章,量子通信包括多种协议与应用类型: 基于量子隐形传态与量子存储中继等技术,可实现量子态信息传输,进而构建量子信息网络,已成为当前科研热点&…

GDB的TUI模式(文本界面)

2023年9月22日,周五晚上 今晚在看GDB的官方文档时,发现GDB居然有文本界面模式 TUI (Debugging with GDB) (sourceware.org) GDB开启TUI的条件 GDB的文本界面的开启条件是:操作系统有适当版本的curses库 The TUI mode is supported only on…

ArrayList 的自动扩容机制

触发扩容 ArrayList 是一个数组结构的存储容器,默认情况下,数组的长度是 10 当然我们也可以在构建 ArrayList 对象的时候自己指定初始长度。随着在程序里面不断的往 ArrayList 中添加数据,当添加的数据达到 10 个的时候,ArrayLis…

web:[GXYCTF2019]Ping Ping Ping

题目 点进题目,页面只显示/?ip,没有其他信息 联系到题目名为ping,猜测题目于ping地址有关,先尝试一下 构造payload http://31e941af-c0d7-49c9-a3fe-84cb13d8adae.node4.buuoj.cn:81/?ip127.0.0.1 这里猜测可能为远程命令执行…

Linux(CentOS)安装msf

目录 一、安装MSF 1.1 在线安装 1.2 离线安装 二、安装Postgresql数据库 一、安装MSF 1.1 在线安装 需要挂梯子!挂完梯子需要reboot重启,多试几次就可以,国内网络我试了很久都不行。没条件没梯子的看1.2离线安装 cd /opt curl https://ra…

Cortex-M4之FPU单元

最近在学习实时操作系统,以下是我对学习实时操作系统过程中做的一些笔记。 一、FPU单元 在 Coretex-M4 处理器中有一个可选的单精度 FPU 单元,一般 STM32F429 就有 FPU 单元, 如果使能了 FPU 单元的话就可以使用它来对单精度浮点数进行计算…

【探索Linux世界|中秋特辑】--- 倒计时和进度条的实现与演示

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…