资讯动态

理解JVM 内存模型、类加载机制、垃圾回收机制原理、优化机制,熟练使用JProfiler、Arthas等工具进行线下和线上项目内存、线程等紧急问题的排查,并对代码进行优化。

发布时间:2026/9/15 11:22:42 来源:尧图企业网站定制
JVM 内存模型程序计数器:CPU上下文切换时保存中断和恢复的线程执行的字节码的地址。虚拟机栈包含局部变量表保存a1的地址、操作数栈(执行a临时地址)、动态连接符合引用变为直接引用和返回地址方法返回值地址可以通过-Xss设置栈桢大小。本地方法栈调用C和C的代码。方法区:元空间在本地内存加载的类信息和常量池字符串常量池在堆中。堆old区young区2:1。young区又包含eden区和suivivor区from和to8:1:1。类加载机制加载JVM通过类的全名获取定类的二进制字节流并在内存中生成一个类对象用于访问该类的入口。连接包含三步验证验证加载的类和规性。准备为类的静态变量分配内存并设置默认值。解析将类的符号引用替换为直接引用比如A类里面包含B类直接换成B类的指针地址。初始化static块中的语句和静态变量赋值合并按照顺序进行赋值没加载父类则先加载父类。new A extend B先加载B类按照排列顺序执行static块中的语句和静态变量赋值再加载A类的。其次加载 普通代码块和普通变量的初始值合并最好执行构造方法也是先加载B其次A。双亲委派机制类加载器Application Class Loader应用的类、Extension Class Loader/lib/ext、Bootstrap Class Loaderjt.jar。先向上委派Bootstrap 加载不了就向下Extension 再是Application 加载。保证核心类不被篡改或者二次加载。JMM内存模型volatile保证可见性 缓存一致性协议禁止指令重排序比如双重检查的指令重排public class Singleton {private static volatile Singleton instance;private Singleton() { // 私有构造函数防止被实例化 } public static Singleton getInstance() { if (instance null) { // 第一次检查 synchronized (Singleton.class) { if (instance null) { // 第二次检查 instance new Singleton(); } } } return instance; }}instance new Singleton();1.分配对象的内存空间。2.初始化对象。3.将instance指向分配的内存地址。步骤3可能会被重排到步骤1和步骤2之前执行。这意味着当线程A执行到instance new Singleton();这行代码时它可能只是分配了内存空间并将instance指向了这块内存但还没有初始化对象。垃圾回收机制原理*对象分配过程垃圾回收器‌标记-清除算法Mark-Sweep Algorithm‌‌标记阶段‌从根节点如栈帧中的局部变量表、静态变量等开始遍历所有可达对象并标记为存活状态。‌清除阶段‌遍历整个堆回收未被标记的对象即垃圾对象所占用的内存空间。‌缺点‌效率较低需要两次遍历堆内存。清除后可能产生大量不连续的内存空间碎片导致内存碎片化问题。‌复制算法Copying Algorithm‌将堆内存分为两个相等的区域例如From区和To区。每次只使用其中一个区域进行内存分配。当该区域满时将存活的对象复制到另一个区域并清空当前区域。‌优点‌没有内存碎片问题因为每次复制后对象都是连续存储的。吞吐量高因为只搜索并复制活动对象。‌缺点‌需要额外的空间来复制存活对象内存利用率较低。‌标记-整理算法Mark-Compact Algorithm‌‌标记阶段‌与标记-清除算法相同从根节点开始标记所有可达对象。‌整理阶段‌将所有存活对象压缩到内存的一端按顺序排放然后清理边界外的所有空间。‌优点‌解决了内存碎片问题提高了空间利用率。‌缺点‌效率较低需要标记所有存活对象并整理它们的引用地址。Serial单线程进行垃圾收集会stw复制算法。Serial old标记-压缩算法。ParNewSerial收集器的多线程版本。多线程会stw复制算法。CMS并行和并发收集器最短的stw低吞吐量。标记整理。初始标记(stw,标记gc root)- 并发标记(标记gc root后续的链的对象)-重新标记(重新标记这段时间发生变化的对象)-并发清除(采用标记清除算法)-XX:CMSFullGCsBeforeCompaction 指定多少次fullgc后进行碎片整理。Parallel Scavenge注重吞吐量gc器复制算法。Parallel Old注重吞吐量gc器标记整理。G18g和8c以上内存用2048个Region超过50%的Region大小的对象直接放入大对象区。回收过程和原来的一样只是在进行young gc的时候会把对象复制到相邻的区域若相邻区域不够则进行full gc 按照用户配置的stw时间默认200ms进行stw方式gc优先回收垃圾比例高的区域RSet机制保证对象引用关系。处理大内存、多核CPU优秀。优化机制-Xmx4g -Xms4g 堆空间大小不让扩容提升性能。–XX:MetaspaceSize200m 默认启动时20m太小了-XX:UseG1GC -XX:MaxGCPauseMilis50 --cms 指定多少次进行标记整理-XX:NewRatio1这样扩大新生代整体大小从而减少垃圾进入old区的次数。-XX:MaxTenuringThreshold 默认15设置成615次s区交互明细太大了。–XX:HeapDumpOnOutOfMemoryError–XXPrintGCDetails 用于导出gc日志通过在线的aigc分析内存溢出情况JProfiler本地的jar压测attach上本地的jar从而排查线程和内存情况或者导入线上的dump文件进行gc引用分析。Arthas1.dashboard 总体jvm面板 线程 jvm内存 环境变量2.thead -n 高cpu线程堆栈 thead -b死锁3.jad 反编译类 用于看看自己的代码提交没getstatic 用于得到静态属性的值4.ognl 直接修改线上属性的值 救急[doge]以下配合 idea 插件3.watch 查看一个方法的入参出参4.trace trace com.example.demo.TestService getUserInfo -n 5 --skipJDKMethod false---[1.234ms]com.example.demo.TestService:getUserInfo()---[0.123ms]com.example.demo.UserDao:findById()|---[0.100ms]java.sql.Connection:prepareStatement()#JDK方法需--skipJDKMethodfalse ---[1.111ms]com.example.demo.Utils:formatUser()5.stack 查看一个方法的栈调用 主要用于查看方法哪里调用springboot项目6.tt 监控接口入参出参耗时 并且回放接口7.heapdump --live /tmp/dump.hprof 保存内存快

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价