是时候讲讲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、针对课上提出的问题,如何调优?


转载 鲁班学院

相关文章
|
存储 监控 算法
jvm-性能调优(二)
jvm-性能调优(二)
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
1249 3
|
11月前
|
监控 Java 编译器
Java虚拟机调优指南####
本文深入探讨了Java虚拟机(JVM)调优的精髓,从内存管理、垃圾回收到性能监控等多个维度出发,为开发者提供了一系列实用的调优策略。通过优化配置与参数调整,旨在帮助读者提升Java应用的运行效率和稳定性,确保其在高并发、大数据量场景下依然能够保持高效运作。 ####
244 58
|
10月前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
12月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
11月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
11月前
|
监控 Java 测试技术
Elasticsearch集群JVM调优垃圾回收器的选择
Elasticsearch集群JVM调优垃圾回收器的选择
343 1
|
11月前
|
监控 Java 编译器
Java虚拟机调优实战指南####
本文深入探讨了Java虚拟机(JVM)的调优策略,旨在帮助开发者和系统管理员通过具体、实用的技巧提升Java应用的性能与稳定性。不同于传统摘要的概括性描述,本文摘要将直接列出五大核心调优要点,为读者提供快速预览: 1. **初始堆内存设置**:合理配置-Xms和-Xmx参数,避免频繁的内存分配与回收。 2. **垃圾收集器选择**:根据应用特性选择合适的GC策略,如G1 GC、ZGC等。 3. **线程优化**:调整线程栈大小及并发线程数,平衡资源利用率与响应速度。 4. **JIT编译器优化**:利用-XX:CompileThreshold等参数优化即时编译性能。 5. **监控与诊断工
|
11月前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。