是时候讲讲JVM调优了

简介: 是时候讲讲JVM调优了

是时候讲讲JVM调优了

这节课中我会教你如何计算对象的大小,然后会讲到影响对象大小的一个底层技术:指针压缩及其实现细节,最后咱们通过实战来深刻理解JVM调优。


oop模型


第一个课给大家讲了Klass模型,它是Java类的元信息在JVM中的存在形式。今天讲的oop模型是Java对象在JVM中的存在形式



对象的内存布局


第一张图是大家眼中的内存布局图,但是我在测试的过程中我发现还有另外一种情况,具体细节咱们课上谈



计算对象大小


具体细节见课堂上操作实战


用jol-core包或者HSDB都可以看,区别是HSDB只能看基于普通类生成对象的大小,java中的数组因为是运行时生成的,故它的大小只有运行时才能知晓。


1、空对象(没有实例属性的对象)

public class CountEmptyObjectSize {


   public static void main(String[] args) {

       CountEmptyObjectSize obj = new CountEmptyObjectSize();


       System.out.println(ClassLayout.parseInstance(obj).toPrintable());

   }

}

2、普通对象

public class CountObjectSize {


   int a = 10;

   int b = 20;


   public static void main(String[] args) {

       CountObjectSize object = new CountObjectSize();


       System.out.println(ClassLayout.parseInstance(object).toPrintable());

   }

}

3、数组对象

public class CountSimpleObjectSize {


   static int[] arr = {0, 1, 2};


   public static void main(String[] args) {

       CountSimpleObjectSize test1 = new CountSimpleObjectSize();


       System.out.printf(ClassLayout.parseInstance(arr).toPrintable());

   }

}


指针压缩


具体细节见课堂上操作实战

jdk6以后引入的技术,默认是开启的,可以调优:-XX:+/-UseCompressedOops


1、指针压缩的实现原理


2、开启指针压缩的情况下,一个oop表示的最大对空间是多少


3、如何扩容


4、为什么没这样做


5、扩容是修改OS底层源码还是JVM底层源码


JVM调优


1、为什么要调优

  • 防止出现OOM
  • 解决OOM
  • 减少full gc出现的频率


2、到底调什么

  • 在项目部署到线上之前,基于可能的并发量进行预估调优
  • 在项目运行过程中,部署监控收集性能数据,平时分析日志进行调优
  • 线上出现OOM,进行问题排查与调优


实战:亿级流量系统调优


这里以亿级流量秒杀电商系统为例:

1、如果每个用户平均访问20个商品详情页,那访客数约等于500w(一亿 / 20)

2、如果按转化率10%来算,那日均订单约等于50w(500w * 10%)

3、如果40%的订单是在秒杀前两分钟完成的,那么每秒产生1200笔订单(50w * 30% / 120s)

4、订单支付又涉及到发起支付流程、物流、优惠券、推荐、积分等环节,导致产生大量对象,这里我们假设整个支付流程生成的对象约等于20K,那每秒在Eden区生成的对象约等于20M(1200笔 * 20K)

5、在生产环境中,订单模块还涉及到百万商家查询订单、改价、包邮、发货等其他操作,又会产生大量对象,我们放大10倍,即每秒在Eden区生成的对象约等于200M(其实这里就是在大并发时刻可以考虑服务降级的地方,架构其实就是取舍)

这里的假设数据都是大部分电商系统的通用概率,是有一定代表性的。

如果你作为这个系统的架构师,面对这样的场景,你会如何做JVM调优呢?即将运行该系统的JVM堆区设置成多大呢?



练习

1、针对课上提出的问题,如何调优?


转载 鲁班学院

相关文章
|
11天前
|
存储 监控 算法
jvm-性能调优(二)
jvm-性能调优(二)
|
3月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
215 3
|
3月前
|
监控 Java 测试技术
JVM 性能调优 及 为什么要减少 Full GC
JVM 性能调优 及 为什么要减少 Full GC
94 4
|
4月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
86 1
|
4月前
|
监控 Java 测试技术
Java中的JVM调优技巧
Java中的JVM调优技巧
|
12天前
|
Kubernetes Java 编译器
解锁极致性能:Quarkus如何让JVM应用调优变得前所未有的简单与高效!
Quarkus是一款专为GraalVM和OpenJDK设计的Kubernetes Native Java框架,采用AOT编译技术将Java应用转化为本地代码,大幅提升启动速度与运行效率。它简化了性能调优流程,如自动优化垃圾回收、类加载、内存管理及线程管理等,使开发者无需深入理解JVM细节即可轻松提升应用性能。与传统JVM应用相比,Quarkus显著降低了性能调优的复杂度。
47 2
|
3月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
3月前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
164 10
|
3月前
|
监控 算法 Java
深入理解Java虚拟机:JVM调优的实用策略
在Java应用开发中,性能优化常常成为提升系统响应速度和处理能力的关键。本文将探讨Java虚拟机(JVM)调优的核心概念,包括垃圾回收、内存管理和编译器优化等方面,并提供一系列经过验证的调优技巧。通过这些实践指导,开发人员可以有效减少延迟,提高吞吐量,确保应用稳定运行。 【7月更文挑战第16天】
|
3月前
|
JSON Java BI
一次Java性能调优实践【代码+JVM 性能提升70%】
这是我第一次对系统进行调优,涉及代码和JVM层面的调优。如果你能看到最后的话,或许会对你日常的开发有帮助,可以避免像我一样,犯一些低级别的错误。本次调优的代码是埋点系统中的报表分析功能,小公司,开发结束后,没有Code Review环节,所以下面某些问题,也许在Code Review环节就可以避免。
149 0
一次Java性能调优实践【代码+JVM 性能提升70%】