黑马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.mzph.cn/news/85417.shtml

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

相关文章

读高性能MySQL(第4版)笔记14_备份与恢复(中)

1. 在线备份 2. 离线备份 2.1. 关闭MySQL做备份是最简单、最安全的 2.2. 所有获取一致性副本的方法中最好的 2.3. 损坏或不一致的风险最小 2.4. 根本不用关心InnoDB缓冲池中的脏页或其他缓存 2.5. 不需要担心数据在尝试备份的过程中被修改 2.5.1. 服务器不对应用提供访问…

vuex的安装和使用

1、安装 注意应安装和Vue对应的版本。 vue2安装命令:npm i vuex3 vue3安装命令:npm i vuex4 2、创建vuex文件 store.js import Vue from vue import Vuex from vuexVue.use(Vuex)const state {count: 0 } const mutations {PLUSE(status, val){state.…

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

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

Could not resolve dependencies for project

一 情况 拉了份代码,打包时, 出现了Could not resolve dependencies for project...... 二 解决 maven打完包运行,测试结果和本地不一致_犯错-总结-前进的博客-CSDN博客

Debian搭建smb服务器

1、确保Debian系统已经安装并处于最新状态。您可以使用以下命令更新系统: sudo apt update sudo apt upgrade2、安装Samba软件包。执行以下命令来安装Samba: sudo apt install samba3、编辑Samba配置文件。打开/etc/samba/smb.conf文件: s…

zookeeper + kafka

Zookeeper 概述 Zookeeper是一个开源的分布式服务管理框架。存储业务服务节点元数据及状态信息,并负责通知再 ZooKeeper 上注册的服务几点状态给客户端 Zookeeper 工作机制 Zookeeper从设计模式角度来理解: 是一个基于观察者模式设计的分布式服务管理框架&…

Learn Prompt-GPT-4:能力

GPT-4能力大赏​ 常识知识推理​ 一个猎人向南走了一英里,向东走了一英里,向北走了一英里,最后回到了起点。他看到了一只熊,于是开枪打了它。这只熊是什么颜色的? 答案是白色,因为这种情况只可能发生在北…

Gin学习记录4——Controller和中间件

一. Controller 用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用: package adminimport ("net/http""git…

windows进程管理相关命令

windows进程管理相关命令 根据进程名找到进程 例如python进程 PS C:\Users\27467> tasklist | findstr python python.exe 7088 Console 2 3,364 K python.exe 1580 Console 2 41,…

深度学习自学笔记三:向量化逻辑回归和Python中的广播

目录 一、向量化 二:向量化逻辑回归 三、Python中的广播 一、向量化 向量化(Vectorization)是一种优化技术,可以在机器学习和数值计算中加快代码的执行速度。它的核心思想是使用矩阵和向量运算,而不是显式地循环处…

Spring的RestTemplate学习

Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持&#xff…

数据结构与算法(六)--链表的遍历,查询和修改,删除操作

一、前言 上篇文章我们了解了链表的概念以及链表底层的搭建以及向链表中添加元素的操作。本次我们继续学习链表剩余的操作:遍历,查询和修改、删除操作。 二、链表查询以及遍历 ①获得链表的第index(0-based)个位置的元素(不常用&#xff0…

1447: PIPI的线性表问题Ⅰ

题目描述 已知线性表中的元素以递增序列排列,并以单链表作存储结构。设计算法删除表中所有值相同的多余元素(使得操作后的线性表中所有的值均不相同),同时释放被删结点空间,并分析算法的时间复杂度。 输入 第一行输…

云计算介绍

1.1 SaaS SaaS 是 Software-as-a-Service(软件即服务)1.2 PaaS PaaS 是 Platform-as-a-Service 的缩写,意思是平台即服务。 把服务器平台作为一种服务提供的 商业模式。通过网络进行程序提供的服务称之为 SaaS(Software as a Serv…

2023年海南省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程

2023年海南省职业院校技能大赛(高职组) “软件测试”赛项竞赛规程 一、赛项名称 赛项名称:软件测试 英文名称:Software Testing 赛项组别:高职组 赛项归属产业:电子信息大类 二、竞赛目标 &#xf…

MySQL详细案例 1:MySQL主从复制与读写分离

文章目录 1. MySQL主从复制1.1 使用场景1.2 MySQL的复制类型1.3 主从复制的作用1.4 主从复制的工作过程1.5 实现MySQL主从复制1.5.1 前置准备1.5.2 主服务器mysql配置1.5.3 从服务器1 mysql配置1.5.4 从服务器2 mysql配置1.5.5 测试 1.6 主从复制的3种同步模式1.6.1 异步复制&a…

微信小程序底部安全区域高度获取

CSS 属性 safe-area-inset-bottom safe-area-inset-bottom 就是安全区的高度 padding-bottom:env(safe-area-inset-bottom); wx.getSystemInfoSync() wx.getSystemInfoSync()可以获取系统信息 let system wx.getSystemInfoSync() let bottomSafe system.screenHeight -…

一招解除csdn复制限制

先看这个代码 python读取英文pdf翻译成中文pdf文件导出代码 想要复制代码,csdn有限制怎么办(csdn流氓,无耻) 解除方法 ctrlu 看效果

Linux启动过程详解 Xmind导图笔记

参考大佬博客: 简要描述linux系统从开机到登陆界面的启动过程 Linux启动过程详解 Bootloader详解 来源:从BIOS开始画图了解Linux启动过程——老杨Linux

OpenCV自学笔记二十六:人脸检测

目录 一、人脸检测 二、LBPH人脸识别 三、EigenFaces人脸识别 四、Fisherfaces人脸识别 一、人脸检测 在OpenCV中,人脸检测是一个常见的计算机视觉任务,可以通过Haar级联分类器来实现。Haar级联分类器是一种基于机器学习的目标检测方法,…