JVM调优笔记

2023-09-18 08:11:25

双亲委派机制

app---->ext----->bootstrap 保证系统的核心库不被修改

沙箱安全机制

限制系统资源访问,将java代码限制在虚拟机特定的运行范围中

基本组件
  • 字节码校验器 确保java类文件遵循java规范,帮助java程序实现内存保护
  • 类加载器

native

Java的作用范围达不到了,需要调用底层

栈内存主管程序的运行,生命周期和线程同步

对象的实例化过程

Heap 一个JVM只有一个堆内存,堆内存的大小可调节
堆: 类、方法、常量、变量、引用类型的真实对象

gc的垃圾回收主要是在eden和old区域。
默认情况下,分配的总内存是电脑内存的1/4, 初始化内存是1/64

public class JvmTest {

  public static void main(String[] args) {
    long maxMemory = Runtime.getRuntime().maxMemory();
    long totalMemory = Runtime.getRuntime().totalMemory();
    // maxMemory: 3.56GB
    // totalMemory: 245.5MB
    // -Xmx1024m -Xmx1024m -XX:+PrintGCDetails
    // +HeapDumpOnOutOfMemoryError
    System.out.println("maxMemory: " + FileUtil.formatFileSize(maxMemory) + "\ntotalMemory: " + FileUtil.formatFileSize(totalMemory));
  }

}

JVM问题排查

Arthas

Minor GC、Major GC和full GC的区别

  • MInor GC 新生代收集,非常的频繁,回收的速度快
  • Old GC 老年代收集,CMS收集器单独收集老年代的行为
  • Full GC 整堆收集 对整个java堆和方法区的垃圾收集
  • Mixed GC 混合收集,收集整个新生代和老年代,目前只有G1收集器

JVM 调优工具

jps

查看java的进程
image.png
image.png

-q 输出进程号
-m 输出传递给主函数的参数
-l 主函数的路径
jstat

查看堆信息

options:由以下值构成
-class:显示ClassLoader的相关信息
-compiler:显示JIT编译的相关信息
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息
-gcnewcapacity:显示新生代大小和使用情况
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小
-gcpermcapacity:显示永久代大小
-gcutil:显示垃圾收集信息

image.png

jinfo

查看运行的java程序的拓展参数,支持运行时,修改部分参数
image.png

jmap

查看堆内存使用
image.png

调优思路


运维团队配置的JVM参数已经能满足多数的需求,在个人理解下,JVM调优其实是在理解JVM内存结构以及各种垃圾收集器的前提下,结合现有的业务来调整参数,使应用稳定的运行。参考的指标【吞吐量】、【停顿时间】、【垃圾回收的频率】。

  1. 内存区域大小以及相关策略 (堆内存大小、新生代/老年代占比等—> IO密集型/内存计算密集型)
  2. 垃圾回收器,比如(-XX:+UseG1GC:指定 JVM 使用的垃圾回收器为 G1

-XX:MaxGCPauseMillis:设置目标停顿时间
-XX:InitiatingHeapOccupancyPercent:当整个堆内存使用达到一定比例,全局并发标记阶段 就会被启动等等 多数情况下,JVM已经能够达到开箱即用。

  1. jps查看进程的基础信息, jstat用于看GC的情况、jinfo进程参数、jmap内存信息 dump文件–>内存解析工具、jstak线程信息,排查死锁

JIT优化

内联优化和逃逸分析

内联优化

把目标方法的代码复制到调用的方法中,避免发生真实的方法调用。每次方法的调用都会生成栈帧(压栈出栈记录方法调用的位置),会带来一定的性能损耗。调整(-XX:MaxFreqInlineSize)

逃逸分析

判断一个对象是否被外部方法引用或者外部线程访问的分析技术。
image.png

更多推荐

PB转纯BS工具

pbtowebConvertPowerbuilderUItowebAutomatically.源码地址:GitHub-pcwe2002/pbtoweb:automaticallyconvertPowerbuilderUItoweb支持转换控件WindowDataWindowCommandButtonCheckBoxRa

ES6中新增加的Symbol数据类型及其使用场景

聚沙成塔·每天进步一点点⭐专栏简介在这里插入图片描述⭐ES6中的Symbol数据类型⭐对象属性名称⭐防止属性冲突⭐内置Symbols⭐迭代器和生成器⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界记得点击上方或者右侧链接订阅本专栏哦几何带你启航前端之旅欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、

华为云云耀云服务器L实例评测|基于L实例安装Prometheus+Grafana插件实现数据可视化监控

文章目录一、云耀云服务器介绍二、安装Prometheus创建prometheus.service配置文件启动prometheus服务查看prometheus服务进程三、安装node_exporter下载node_exporter组件包创建node_exporter.service配置文件启动node_exproter服

Docker 存储驱动解析:选择最适合你的存储方案

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

安果浏览器-这才是好用的安卓浏览器。

视频演示:安果浏览器,当之无愧的人民浏览器_哔哩哔哩_bilibili下载地址:安果移动☆一览无余的美观界面:深度优化的用户界面,为您带来简洁而不简单的浏览体验。无论是设计还是功能,安果浏览器都为您考虑到了细节。每一次滑动,每一个点击,都是为了给您带来更好的体验。☆秒速加载,畅快体验:厌倦了等待的时长?安果浏览器利用先

Java 字节流

一、输入输出流输入输出-------读写文件输入-------从文件中获取数据到自己的程序中,接收处理【读】输出-------将自己程序中处理好的数据保存到文件中【写】流-------数据移动的轨迹二、流的分类按照数据的移动轨迹分为:输入流输出流按照每一次读写/数据量的大小将流分成:字节流字符流字节流:每一次可读写一个

使用Canvas绘制一个验证码组件

使用Canvas绘制一个验证码组件前言验证码,这一日常伴随我们的要素,是我们在线交互的重要安全保障。你的手机短信里是否被它占据半壁江山,今天我们就来聊聊如何在网页上实现一个简单的验证码组件。大家在登录网站时为了防止被恶意攻击或者多次点击操作,使用验证码是最常用的实现方式。在学习完Canvas后,通过Canvas实现简单

Linux管理多版本node.js

这里介绍的是Linux版本的nvm工具:一个nodejs版本管理工具!这里可以灵活切换node指定版本哟~下载地址:https://github.com/nvm-sh/nvm/releases/1.安装需要先安装git、curlyuminstall-ygitcurl这里很慢,需要登录。如果不小心退出来,需要重新执行一下

AI绘画Stable Diffusion原理之扩散模型DDPM

前言传送门:stablediffusion:Git|论文stable-diffusion-webui:GitGoogleColabNotebook部署stable-diffusion-webui:GitkaggleNotebook部署stable-diffusion-webui:GitAI绘画,输入一段文本就能生成相关

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建functionget_cookie($name,$key=''){if(!isset($_COOKIE[$name])){returnnull;}$key=empty($key)?C('CFG_COOKIE_ENCODE'):$key;$value=$_CO

Naivcat 数据迁移工具 | 竟然那么香

近期,我们收到一位童鞋的留言(如下图),他建议我们多宣传Navicat的数据迁移工具,因为他身边许多小伙伴并非很了解这一功能。今天,我们为大家深度介绍Naivcat安全、可靠的数据迁移工具。请童鞋们准备好NavicatPremium工具,我们马上开始!数据库数据迁移是指选择、准备、提取和转换数据,并将数据从一个计算机存

热文推荐