JVM性能调优-一.思路方向

一、调优策略

     对于GC的性能主要有2个方面的指标:吞吐量throughput(工作时间不算gc的时间占总的时间比)和暂停pause(gc发生时app对外显示的无法响应)。

1、调优的目的

  调优的最终目的当然增大吞吐量,减少暂停时间咯,映射到GC层面主要关心下面这两点:

      (1)将转移到老年代的对象数量降低到最小。

      (2)减少full GC的执行时间。(尽量减少GC的次数)

那什么情况对象会转移到老年代,主要有这四种:

    (1)新生代对象每经历依次minor gc,年龄会加一,当达到年龄阀值会直接进入老年代。阀值大小一般为15。

    (2)Survivor空间中所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而无需等到年龄阀值。

    (3)大对象直接进入老年代。

    (4)新生代复制算法需要一个survivor区进行轮换备份,如果出现大量对象在minor gc后仍然存活的情况时,就需要老年代进行分配担保,让survivor无法容纳的对象直接进入老年代。

再来分析为什么说要减少full GC时间次数,那得先看GC的两大分类

   Partial GC:并不收集整个GC堆的模式

                Young GC:只收集young gen的GC

                 Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式

                Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式

  Full GC:针对整个新生代、老生代、元空间(metaspace,java8以上版本取代perm gen)的全局范围的GC。这里就明白为什么要减少Full GC的次数了。

一般Full GC所花费的时间是Young GC的十倍。

2、哪些方面可以考虑调优?

为了达到上面的目的,一般地,你可以考虑调优的有:

(1)减少使用全局变量和大对象。

(2)新生代和老年代的大小是否合适。

(3)新生代和老年代所占的比例是否合适。

(4)幸存者区和新生区所占的比例到是否合适。

(5)选择合适的GC收集器。

3、什么情况说明GC已经不错了呢?

此外,如果GC执行时间满足下列所有条件,就没有必要进行GC优化了:

     Minor GC执行非常迅速(50ms以内)

     Minor GC没有频繁执行(大约10s执行一次)

     Full GC执行非常迅速(1s以内)

     Full GC没有频繁执行(大约10min执行一次)

括号中的数字并不是绝对的,它们也随着服务的状态而变化。

二、调优经验(规则)

这些规则,一般是大家比较建议的,可以作为初始配置的时候进行配置建议,当然具体的还得通过JVM工具监测来具体分析。

    (1) -Xmx 和-Xms 一般设置为一样大小。这样能稍微提高GC的运行效率,因为他/她不再需要估算堆是否需要调整大小了。

    (2)官方推荐新生代占堆的3/8。

    (3)幸存代占新生代的1/10。

    (4)垃圾收集器如果内存比较大建议G1收集器,当然也可以用CMS收集器。

    (5)-XX:+DisableExplicitGC禁止System.gc(),免得程序员误调用gc方法影响性能;

    (6)吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代.原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象.

    (7)采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿.

    (8)使用CMS的好处是用尽量少的新生代, 然后老生代利用CMS并行收集, 这样能保证系统低延迟的吞吐效率。

下一篇:JVM性能调优-二.流程步骤实践

下面附上进行JVM的优化的一些参数:

-Xmx300m                        最大堆大小
-Xms300m                       初始堆大小
-Xmn100m                        年轻代大小
-XX:SurvivorRatio=8             Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10-XX:+UseG1GC                    使用 G1 (Garbage First) 垃圾收集器    
-XX:MaxTenuringThreshold=14        提升年老代的最大临界值(tenuring threshold). 默认值为 15[每次GC,增加1岁,到15岁如果还要存活,放入Old区]
-XX:ParallelGCThreads=8            设置垃圾收集器在并行阶段使用的线程数[一般设置为本机CPU线程数相等,即本机同时可以处理的个数,设置过大也没有用]
-XX:ConcGCThreads=8              并发垃圾收集器使用的线程数量-XX:+DisableExplicitGC       禁止在启动期间显式调用System.gc()-XX:+HeapDumpOnOutOfMemoryError   OOM时导出堆到文件
-XX:HeapDumpPath=d:/a.dump        导出OOM的路径
-XX:+PrintGCDetails              打印GC详细信息
-XX:+PrintGCTimeStamps            打印CG发生的时间戳
-XX:+PrintHeapAtGC               每一次GC前和GC后,都打印堆信息
-XX:+TraceClassLoading            监控类的加载
-XX:+PrintClassHistogram          按下Ctrl+Break后,打印类的信息

参考

     JVM参数设置(主要看它的参数表格)

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

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

相关文章

勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

摘要: .halo勒索病毒已成为数字世界中的威胁,通过高级加密技术将文件锁定,并要求支付赎金。本文91数据恢复将深入介绍.halo勒索病毒的工作原理,提供解锁被感染文件的方法,以及探讨如何有效预防这一威胁。如果您正在经…

87 # express 应用和创建应用的分离

创建应用的过程和应用本身要进行分离。路由和创建应用的过程也做一个分离。 下面实现创建应用的过程和应用本身要进行分离: express.js const Application require("./application");function createApplication() {// 通过类来实现分离操作return ne…

unity UDP 通信

客户端 接收端 : using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; using UnityEngine.UI;public cla…

常见音视频、流媒体开源编解码库及官网(四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

Android rom开发:9.0系统上实现4G wifi 以太网共存

framework层修改网络优先级,4G > wifi > eth 修改patch如下: diff --git a/frameworks/base/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/frameworks/base/services/core/java/com/android/server/connectivit…

Unity中Shader抓取屏幕并实现扭曲效果(优化)

文章目录 前言一、在之前顶点着色器的输入中,放弃了使用结构体传入,而是直接从应用程序阶段传入参数,这样写的话,对于程序来说,不方便扩张,所以需要对其进行修改实现1、定义结构体用于传入顶点坐标系2、因为…

力扣1、两数之和

转到力扣 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可…

开始撸 Android 源码

启动找工作模式,发现无比困难。搁在往日,大龄程序员找工作都是一件困难的事情,加上今年形势很差,更是难上加难。关键是我这十几年来主攻的浏览器内核方向,需求量更是几乎为零。在 BOSS 直聘上以 Chromium 为关键词&…

华为云云耀云服务器L实例评测|Git 私服搭建指南

前言 本文为华为云云耀云服务器L实例测评文章,测评内容是 云耀云服务器L实例 Git 私有服务器搭建指南 系统配置:2核2G 3M Ubuntu 20.04 我们平时在使用代码托管服务的时候,可能某些代码托管平台对成员有限制,或是由于内容原因会对…

教你如何清理 Docker 存储驱动的磁盘占用空间

Author:rab 有时候你会发现,你的 Docker 业务容器虽然做了数据持久化,且数据持久化的磁盘空间占用并不大,但是 Docker 的 Overlay2 目录占用却很大。我们知道 Overlay2 是 Docker 的存储驱动,也是 Docker 默认的存储驱…

Vue Router最佳实践,以确保你的Vue.js应用的路由管理清晰、可维护和高效

文章目录 路由结构设计命名路由动态路由参数导航守卫命名视图 (Named Views)懒加载路由错误处理 ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区…

3D动画制作和渲染需要什么样的硬件规格?

动画是艺术与技术的令人兴奋的融合,为无限的创造力提供了广阔的画布。为了将创意愿景变为现实,动画师需要适合其工艺的强大计算资源。每个动画项目都有不同的硬件需求,无论是制作简单的 2D 动画还是构建复杂的 3D 世界。因此,有抱…

企业架构LNMP学习笔记51

企业案例使用: 主从模式: 缓存集群结构示意图: 去实现Redis的业务分离: 读的请求分配到从服务器上,写的请求分配到主服务器上。 Redis是没有中间件来进行分离的。 是通过业务代码直接来进行读写分离。 准备两台虚…

Java快速入门

Java 是什么? Java 的特点: 面向对象平台无关(跨平台):简单安全体系结构 - 中性可移植健壮多线程解释型高性能分布式动态 Java安装及环境设置: Java 基础语法 对象 - 对象有状态和行为。例如:狗有状态色,名字&…

十七、Webpack搭建本地服务器

一、为什么要搭建本地服务器? 目前我们开发的代码,为了运行需要有两个操作: 操作一:npm run build,编译相关的代码;操作二:通过live server或者直接通过浏览器,打开index.html代码…

Datastage部署与使用

Datastage部署与使用 - 码农教程 https://www.cnblogs.com/lanston/category/739553.html Streamsets定时拉取接口数据同步到HBase集群_streamsets api_webmote的博客-CSDN博客 【SDC】StreamSets实战之路-28-实战篇- 使用StreamSets实时采集指定数据目录文件并写入库Kudu_菜…

蓝桥杯2023年第十四届省赛真题-买瓜--题解

目录 蓝桥杯2023年第十四届省赛真题-买瓜 题目描述 输入格式 输出格式 样例输入 样例输出 提示 【思路解析】 【代码实现】 蓝桥杯2023年第十四届省赛真题-买瓜 时间限制: 3s 内存限制: 320MB 提交: 796 解决: 69 题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个…

Git 的基础命令 码云 gitee

就比如,我们的开发吧,我自己本地分支是dqh,远程分支也是new //我开始提交代码 //1,git add . //2,git commit -mXXX功能 //3,git pull origin new(你们现在这个版本的开发分支) //这里…

【C语言】指针的进阶(二)—— 回调函数的讲解以及qsort函数的使用方式

目录 1、函数指针数组 1.1、函数指针数组是什么? 1.2、函数指针数组的用途:转移表 2、扩展:指向函数指针的数组的指针 3、回调函数 3.1、回调函数介绍 3.2、回调函数的案例:qsort函数 3.2.1、回顾冒泡排序 3.2.1、什么是qso…

HarmonyOS应用侧与前端页面数据通道建立

一、应用侧调用前端页面函数 应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触发前端页面的htmlTest()方法。 前端页面代码。 <!-- index.html --> <!DOCTYPE ht…