Java虚拟机(JVM)调优思路

Java虚拟机优化方法 随着时间的推移,许多优化已经提高了 JVM 的性能。然而,尽管 Java 通常是第一个成功实现它们的虚拟机,但它们也经常被用于其他类似的平台。 阅读详情

title: Java虚拟机(JVM)调优思路
date: 2022-04-09 00:00:00
tags:

  • JVM
  • 性能调优
    categories:
  • Java

请添加图片描述

调什么

内存方面

  1. JVM需要的内存总大小
  2. 各块内存分配,新生代、老年代、存活区
  3. 选择合适的垃圾回收算法、控制GC停顿次数和时间
  4. 解决内存泄露的问题,辅助代码优化
  5. 内存热点:检查哪些对象在系统中数量最大,辅助代码优化

线程方面

  1. 死锁检查,辅助代码优化
  2. Dump线程详细信息:查看线程内部运行情况,查找竞争线程,辅助代码优化
  3. CPU热点:检查系统哪些方法占用的大量CPU时间,辅助代码优化

如何调

  1. 监控JVM的状态,主要是内存、线程、代码、I/O几个部分
  2. 分析结果,判断是否需要优化
  3. 调整GC类型和内存分配;修改并优化代码
  4. 不断的重复分析和调整,直至找到优化的平衡点

JVM调优的目标

  1. GC的时间足够的小
  2. GC的次数足够的少
  3. 将转移到老年代的对象数量降低到最小
  4. 减少full GC的执行时间
  5. 发生Full GC的间隔足够的长

JVM调优冷思考

  1. 多数的Java应用不需要在服务器上进行GC优化
  2. 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题
  3. 在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合)
  4. GC优化是到最后不得已才采用的手段
  5. 在实际使用中,分析GC情况优化代码比优化GC参数要多得多
  6. 如下情况通常不用优化:
  • Minor GC执行时间不到50ms
  • Minor GC执行不频繁,约10秒一次
  • Full GC执行时间不到1s
  • Full GC执行频率不算频繁,不低于10分钟1次

常见调优策略

  1. 减少创建对象的数量
  2. 减少使用全局变量和大对象
  3. 调整新生代的大小到最合适
  4. 设置老年代的大小为最合适
  5. 选择合适的GC收集器
  6. 将转移到老年代的对象数量降到最少
  7. 减少Full GC的执行时间

调优经验

  1. 要注意32位和64位的区别,通常32位的仅支持2-3g左右。
  2. 要注意client模式和Server模式的选择:client runtime是快速启动,更小的内存占用以及快速代码(机器码)生成的JIT编译器。server runtime有更复杂的代码生成优化,作为服务型应用更为靠谱
  3. 要想GC时间小必须要一个更小的堆;而要保证GC次数足够少,又必须保证一个更大的堆,这两个是有冲突的,只能取其平衡。
  4. 针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,通常把最大、最小设置为相同的值。
  5. 新生代和老年代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以通过-XX:newSize -XX:MaxNewSize来设置其绝对大小,同样,为了防止新生的堆收缩,通常会把-XX:newSize -XX:MaxNewSize设置为同样大小。
  6. 更大的新生代必然导致更小的老年代,大的新生代会延长普通GC的周期,但会增加每次GC的时间;小的老年代会导致更频繁的Full GC;更小的新生代必然导致更大老年代,小的新生代会导致普通GC很频繁,但每次的GC时间会更短;大的老年代会减少Full GC的频率。
  7. 如果应用存在大量的临时对象,应该选择更大的新生代;如果存在相对较多的持久对象,老年代应该适当增大。在抉择时应该本着Full GC尽量少的原则,让老年代尽量缓存常用对象,JVM的默认比例1:2也是这个道理。
  8. 通过观察应用一段时间,看其在峰值时老年代会占多少内存,在不影响Full GC的前提下,根据实际情况加大新生代,比如可以把比例控制在1:1。但应该给老年代至少预留1/3的增长空间。
  9. 线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程。

内存泄漏

一:内存泄露导致系统崩溃前的一些现象

  1. 每次垃圾回收的时间越来越长,FullGC的时间也延长到好几秒
  2. FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC
  3. 老年代的内存越来越大,并且每次FullGC后年老代没有内存被释放,慢慢的系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值。

二:老年代堆空间被占满的情况

  1. 这是非常典型的内存泄漏的垃圾回收情况,通常监控图上所有峰值部分都是一次垃圾回收点,所有谷底部分表示是一次垃圾回收后剩余的内存。连接所有谷底的点,可以发现一条由底到高的线,这说明随时间的推移,系统的堆空间被不断占满,最终会占满整个堆空间。
  2. 这种情况的解决方式:一般就是根据垃圾回收前后情况对比,同时根据对象引用情况分析,基本都可以找到泄漏点。

三:堆栈溢出的情况

  1. 通常抛出java.lang.StackOverflowError例外
  2. 这个一般就是递归调用没退出,或者循环调用造成
java虚拟JVM性能优化汇总 JVMJava Virtual Machine)优化是提升Java应用程序性能和运行效率的关键步骤。综上所述,JVM优化是一个综合性的过程,需要根据应用程序的具体情况和性能需求进行针对性的整和优化。通过合理配置和JVM的各种参数和设置,可以显著提升Java应用程序的性能和运行效率。 阅读详情

相关推荐

Syzkaller实战教程2:运行环境配置+实例运行

本文详细介绍了在linux系统上搭建Syzkaller内核模糊测试环境的完整流程。 1.环境配置:通过VMware创建Ubuntu20.04虚拟机A,配置QEMU/KVM虚拟化环境,安装Go语言工具链和Syzkaller; 2.内核编译:下载Linux内核源码并配置KCOV等试选项,编译生成带覆盖率支持的bzImage内核镜像; 3.测试环境构建:使用debootstrap创建Debian虚拟机镜像,通过QEMU启动嵌套虚拟机B; 实例测试: 4.演示两种测试场景 - 提供完整上手教程

cuguanren的博客 1322

Java虚拟机JVM

可以使用不同的垃圾回收器(如Serial、Parallel、CMS、G1等)以及相关的参数来优化垃圾回收。堆内存设置:通过整堆内存的大小来优化JVM性能。可以通过整JIT编译器的相关参数,如编译阈值、内联限制等,来优化JIT编译的性能和效果。以上是一些常见的JVM技巧,具体的策略需要结合具体的应用程序和硬件环境进行整。通过合理地配置线程池的大小和参数,可以控制并发线程的数量,避免线程过多导致的性能下降和资源浪费。类加载JVM的类加载机制对应用程序的启动时间和内存占用有一定的影响。

Nancy_0802的博客 782

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 343

JAVAJava虚拟机性能优化实践

Java虚拟机Java程序的运行环境,它将Java字节码转换为机器码并执行。Java虚拟机提供了自动内存管理、垃圾回收、线程管理等功能,使得Java程序具有跨平台性和高可靠性。Java虚拟机性能优化Java程序开发中非常重要的一环。遵循优化原则,使用优化工具,针对实际问题进行优化,可以提高程序性能和可靠性。同时,Java虚拟机性能优化需要具备一定的专业知识和经验,建议在实践过程中多加思考和总结,不断提高自己的技术水平。

实践是检验真理的唯一标准 854

JVM(Java虚拟机

通过整堆大小、垃圾回收、线程和类加载等参数,可以提高Java应用程序的性能和稳定性。在Java虚拟机JVM)中,通过设置各种参数来优化性能和稳定性,从而提高应用程序的性能和可靠性。笔者将为Java开发人员提供JVM参数的指南,以帮助他们提高Java应用程序的性能和稳定性。建议将-Xmx设置为服务器内存的70-80%,以确保JVM有足够的空间来处理应用程序的内存需求。标准参数是所有JVM实现都支持的参数,而非标准参数则是特定JVM实现支持的参数。Java应用程序的性能和启动速度与类加载器的性能有关。

yqj234的专栏 922

JAVA虚拟机深度解刨》-- JVM思路

JVM

lmj3732018的博客 9262

JVM性能与分析

目录妻管严重症患者友情提示:笨男人才会让女人哭。深入剖析Java虚拟机内存模型Java虚拟机垃圾收集机制解密线上系统java虚拟机思路分享Java虚拟机常见面试题剖析 妻管严重症患者友情提示:笨男人才会让女人哭。 女人是感性的动物,碰到伤心的事情,女人会哭出泪,所以别怪女人的泪多,因为她是感性动物。所以如果她如果哭的越多,那她脑子里的水就越少,对你也就越精明。 深入剖析Java虚拟机内存模型 ...

技术之旅:一位项目管理者的编程视角与项目管理洞见; 555

JVM虚拟机(五)JVM的常用参数

Java命令行参数可以根据其类型和作用范围大致分为以下三种类型:标准选项(Standard Options)示例-version-help-classpath等。描述:这些选项是Java语言规范中定义的标准参数,跨不同JDK版本和实现保持一致,用于设置基本的Java运行环境、类路径、系统属性、日志级别、JAR包代理、启动画面等。它们通常以单个短横线()开头,不带有额外的前缀。非标准(或扩展)选项(Non-standard / Extended Options)示例-Xms<size>

aplis的博客 1308

JVM面试题及原理

介绍JVM参数、工具、内存泄露的排查思路、CPU飙高排查方案与思路面试题及原理

2303_81059616的博客 1031

java重点学习-JVM实践

对于IM,主要就是整年轻代、老年代、元空间的内存空间大小及使用的垃圾回收器类型。jconsole 用于对jvm的内存,线程,类 的监控。

qq_40453972的博客 614

JVM虚拟机-JVM、内存泄漏排查、CPU飙高排查

本文系统解析JVM性能与故障排查,涵盖GC参数配置、内存泄漏检测及CPU飙高定位方法(线程快照与热点代码分析)。详解堆内存溢出根因(大对象分配)。助开发者掌握策略与异常排查链路,提升高并发场景下Java应用的稳定性与性能表现。

Crayon26的博客 1308

Java 面试 八股文】JVM 虚拟机

线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数。难易程度:☆☆☆出现频率:☆☆☆☆线程共享的区域:Java(Heap)Java虛拟机中内存管理的一个重要区域,主要用于存放对象实例和数组。当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

Luo_LA的博客 1960

JVMJVM 虚拟机重点解析

程序计数器:线程私有的,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。javap -verbose xx.class 打印堆栈大小,局部变量的数量和方法的参数。java虚拟机对于多线程是通过线程轮流切换并且分配线程执行时间。在任何的一个时间点上,一个处理器只会处理执行一个线程,如果当前被执行的这个线程它所分配的执行时间用完了【挂起】。处理器会切换到另外的一个线程上来进行执行。并且这个线程的执行时间用完了,接着处理器就会又来执行被挂起的这个线程。

Carefree_State的博客 1503

深入理解Java虚拟机---学习感悟以及笔记

文末彩蛋福利 # 概念 虚拟机:指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)。 Java虚拟机阵营:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、Azul VM、Apache Har...

csdn鲲鹏号 1129

Java虚拟机性能优化技巧

Java虚拟机(JVM)Java平台的核心组件,负责将Java字节码转换为机器码并执行。JVM性能直接影响Java应用的响应速度、吞吐量和资源利用率。本文将深入探讨JVM性能优化的关键技术和最佳实践,帮助开发者和运维人员提升Java应用性能。

exlink2012的专栏 898

浅谈Java虚拟机及其优化

1:jdk体系结构 2:Java为解释性语言,跨平台(一行代码,到处运行): 3:Java虚拟机模型 &执行顺序。类装载子系统->运行时数据区->字节码执行引擎 以下代码为测试代码,通过以下代码详解运行过程 public class Test6 { public static final int initData = 123; pub...

Lion_H的博客 325

java 默认堆大小_Java堆大小[z]

JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。 32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在WindowsServer2003系统,3.5G物理内存,JDK5.0下 测试,最大可设置为1478m。典型JVM参数配置:java-Xmx3550m-Xms3550m-Xmn2g-Xss...

weixin_42554408的博客 917

性能优化 - JVM 优化

JVMJava 虚拟机)是一个能够解释和执行 Java 字节码的虚拟计算机,它是 Java 程序运行的基础平台。JVM 包含了多个子系统,包括类加载器子系统、内存管理子系统、执行引擎子系统等,可以将 Java 程序翻译成为机器指令运行在不同的操作系统平台上。注意:JVM 是运行在操作系统之上的,它与硬件没有直接的交互,如下图所示:JVM 优化则是指对 Java 程序在运行时的性能进行提升的一系列技术和策略。

whoyouare6165的博客 3418

Java基础 | JVM

Java基础 | JVM

qq_20236937的博客 2587

深入理解Java虚拟机的工作原理与性能优化

本文深入探讨了Java虚拟机JVM)的工作原理,包括字节码的执行、JVM的不同实现及其运行时数据区的组成。文章解释了Java如何通过JVM实现跨平台运行,并对性能优化进行了讨论,特别是在JVM规范和垃圾回收机制方面。

weixin_28931449的博客 707

java项目之唐史文化管理系统vue(完整前后端+说明文档+mysql).zip

采用vue前端,springboot后台框架开发,java语言,mysql数据库采用前台+后台的模式开发网站前台:用户注册,登录文化中心查看:查看唐代史学的文化信息,图片文字形式书籍推荐:管理员推荐的书籍可以在这里展示,点击收藏文化讲座:可以选择查看文化讲座,并且进行预定(用户注册,登录后预定)唐史视频列表,播放(用户注册,登录后查看播放)后台:管理员管理员密码修改注册用户管理,审核唐史文化管理书籍信息管理,推荐(人工推荐)文化讲座发布,管理文化讲座预定管理,审核唐史视频管理用户个人资料修改我的讲座预定推荐书籍收藏

上一篇: MySQL使用技巧整理
下一篇: 在Linux环境安装ElasticSearch8.3和Kibana8.3
TerrenceTian
博客等级 码龄15年 33粉丝 86原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值