一、事故背景:风平浪浪静下的暗流 我们有一个稳定运行的 Spring Boot 应用,日常通过监控平台观察,其 JVM 堆内存(Heap Memory)使用率一直非常平稳,老年代(Old Gen)占用率低,看不出任何内存泄漏的迹象。然而,一个诡异的问题持续困扰着我们:每次发布新版本的程序后,应用启动阶段总会触发一次甚至多次 Full GC。 这让人非常困惑,既然平时内存没问题,为什么偏偏在发布这个…
Leave a Comment分类: jvm
在Java开发中,尤其是编写框架或工具类时,反射(Reflection)是一个强大但又容易混淆的工具。其中,Class 对象的 getMethods() 和 getDeclaredMethods() 方法是获取类方法的两个常用入口,但它们的行为差异巨大,经常成为初学者的困惑点。 今天,我们就来彻底厘清这两者的区别,让你在需要时能够毫不犹豫地做出正确选择。 一、核心区别速览 如果你赶时间,下面这张表…
Leave a Comment我们在开发和部署 Spring Boot 应用时,经常会被提醒:“生产环境一定要配置 JVM 参数!” 但你是否好奇,如果我们“偷懒”不配置任何 JVM 参数(如 -Xms, -Xmx),Spring Boot 项目的内存占用会是怎样的呢?本文将为你揭开这个谜底。 核心要点 Spring Boot 本身并不决定内存分配。它作为一个标准的 Java 应用程序,其内存行为完全由运行它的 Java 虚拟…
Leave a Comment一、方法区 JVM方法区是用于保存已经被虚拟机加载的类元信息(包括类的版本、字段、方法、接口和父类等信息)、运行时常量信息(static、final定义的常量)、字符串常量信息(String a=”dfc”)。 1、方法区、永久代、元数据区的关系 方法区是JVM 定义的一种规范,是所有虚拟机都需要遵守的约定, 而“永久代(PermGen space)”和“元数据(…
Leave a Comment什么时候触发Young GC—针对年轻代 当Eden区满了的时候,会触发Young GC 什么时候触发 Full GC—针对整个堆 -XX:HandlePromotionFailure:是否设置空间分配担保 JDK7及以后这个参数就失效了. 只要老年代的连续空间大于新生代对象的总大小或者历次晋升到老年代的对象的平均大小就进行MinorGC,否则FullGC 所谓大对象,是指…
Leave a Comment背景 一次项目巡检发现某个项目的函数执行TP99的波动很大: 看这个图感觉很离谱,随即排查问题原因,看到JVM的监控如下: 发现程序一直在执行fullGC,我们知道fullGC的成本是非常大的,这肯定是导致应用卡顿的原因。 尝试解决 我去看了机器的监控,发现服务是部署在8G内存的容器里面的,实际占用内存只有7%都不到。 通过这里我们知道,实际机器的内存还是有很大的富余的,那肯定是哪里限制了jvm去…
Leave a Comment参考资料: https://www.baeldung.com/java-instrumentation https://medium.com/@shehan.a.perera/using-a-java-agent-to-monitor-application-runtime-behavior-using-metrics-664eb95e971c https://www.jrebel.com/blo…
Leave a Comment