北京企业网站开发公司哪家好很那网站建设
2026/5/13 23:09:50 网站建设 项目流程
北京企业网站开发公司哪家好,很那网站建设,wordpress文章表格自适应,建设信息网查询在 Java 应用性能优化中#xff0c;JVM 调优和常量池管理是两个关键环节。本文将深入解析 Arthas 工具、GC 日志分析、JVM 参数设置#xff0c;以及 Class 常量池与运行时常量池的原理与应用#xff0c;助您掌握 JVM 调优的核心技能。 一、Arthas 工具详解 1. 简介 Artha…在 Java 应用性能优化中JVM 调优和常量池管理是两个关键环节。本文将深入解析 Arthas 工具、GC 日志分析、JVM 参数设置以及 Class 常量池与运行时常量池的原理与应用助您掌握 JVM 调优的核心技能。一、Arthas 工具详解1. 简介Arthas 是阿里巴巴在 2018 年 9 月开源的 Java 诊断工具支持 JDK6采用命令行交互模式可以方便地定位和诊断线上程序运行问题。​核心特点​无需重启应用即可诊断问题功能丰富支持多种诊断场景交互式命令行界面使用简单2. 安装与使用# 下载Arthaswgethttps://alibaba.github.io/arthas/arthas-boot.jar# 运行Arthasjava -jar arthas-boot.jar运行后Arthas 会列出当前机器上所有 Java 进程选择目标进程 ID 即可进入交互模式。3. 常用命令命令说明使用场景dashboard查看进程运行状况线程、内存、GC、运行环境全局视角查看系统运行状况thread查看线程详细情况分析线程状态、CPU 占用thread -b查看线程死锁检测线程死锁jad反编译类查看线上代码是否是正确版本ognl执行表达式更灵活的代码调试4. 使用场景Arthas 可以帮助解决以下常见问题是否有一个全局视角来查看系统的运行状况为什么 CPU 又升高了到底是哪里占用了 CPU运行的多线程有死锁吗有阻塞吗程序运行耗时很长是哪里耗时比较长呢这个类从哪个 jar 包加载的为什么会报各种类相关的 Exception我改的代码为什么没有执行到难道是我没 commit遇到问题无法在线上 debug难道只能通过加日志再重新发布吗有什么办法可以监控到 JVM 的实时运行状态二、GC 日志详解1. 打印 GC 日志方法在 JVM 参数中添加以下参数即可打印 GC 日志-Xloggc:./gc-%t.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintGCTimeStamps -XX:PrintGCCause -XX:UseGCLogFileRotation -XX:NumberOfGCLogFiles10-XX:GCLogFileSize100M对于 Tomcat直接加在 JAVA_OPTS 变量里即可。2. GC 日志解析以下是一个 GC 日志示例2023-05-15T14:30:22.1230800: 2.909: [Full GC (Metadata GC Threshold) 6160K-0K(141824K), 0.0209707 secs]​关键信息解析​2.909从 JVM 启动开始计算到这次 GC 经过的时间Full GC (Metadata GC Threshold)这是一次 Full GC原因是元空间不足6160K-0K(141824K)GC 前年轻代占用 6160KGC 后占用 0K年轻代总大小 141824K112K-6056K(95744K)GC 前老年代占用 112KGC 后占用 6056K老年代总大小 95744K0.0209707 secsGC 总耗时 0.0209707 秒3. GC 日志分析工具​**gceasy (https://gceasy.io)**​可以上传 GC 日志文件提供可视化的 GC 分析界面展示年轻代、老年代、永久代的内存分配和最大使用情况提供 JVM 智能优化建议部分功能需付费4. GC 日志优化案例​问题​元空间不够导致频繁 Full GC​优化前参数​-Xms1536M -Xmx1536M -Xmn512M...​优化后参数​-Xloggc:./gc-adjust-%t.log -XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M...​效果​优化后 GC 日志中不再出现因元空间不足导致的 Full GC。三、JVM 参数汇总1. 查看 JVM 参数# 查看默认参数java -XX:PrintFlagsInitial# 查看生效参数java -XX:PrintFlagsFinal2. 常用 JVM 参数参数说明适用场景-Xms初始堆大小优化内存分配-Xmx最大堆大小避免内存溢出-Xmn年轻代大小优化 GC 频率-XX:SurvivorRatioSurvivor 区比例减少对象进入老年代-XX:MaxTenuringThreshold对象晋升老年代阈值优化对象生命周期-XX:PretenureSizeThreshold大对象直接进入老年代阈值避免大对象占用 Survivor 区-XX:MetaspaceSize元空间初始大小避免元空间 Full GC-XX:MaxMetaspaceSize元空间最大大小控制元空间使用四、Class 常量池与运行时常量池1. Class 常量池Class 常量池是 Class 文件中的资源仓库包含编译期生成的各种字面量和符号引用。​Class 文件 16 进制结构​类版本字段方法接口常量池​常量池主要包含两类常量​字面量字符串、数值等符号引用类和接口全限定名、字段名称和描述符、方法名称和描述符2. 字面量字面量是指由字母、数字等构成的字符串或者数值常量只能作为右值出现。​示例​inta1;// 1是字面量intb2;// 2是字面量Stringcabc;// abc是字面量3. 符号引用符号引用是编译原理中的概念主要包括类和接口的全限定名字段的名称和描述符方法的名称和描述符​示例​publicclassMath{publicintcompute(){...}}在常量池中Lcom/tuling/jvm/Math是类的全限定名compute是方法名称()是描述符。4. 运行时常量池当 Class 被加载到内存后常量池就变成了运行时常量池符号引用在程序加载或运行时会被转变为直接引用动态链接。​示例​compute()这个符号引用在运行时会被转变为compute()方法在内存中的地址通过对象头里的类型指针进行转换五、字符串常量池1. 设计思想字符串的分配和其他对象分配一样耗费高昂的时间与空间代价。JVM 为了提高性能和减少内存开销为字符串开辟了常量池。​设计原理​创建字符串时先查询字符串常量池如果存在返回引用实例如果不存在创建字符串对象并放入池中2. 字符串常量池位置JDK 版本字符串常量池位置JDK 6 及之前永久代PermGenJDK 7从永久代分离到堆中JDK 8 及之后堆中​验证代码​publicclassRuntimeConstantPoolOOM{publicstaticvoidmain(String[]args){ArrayListStringlistnewArrayListString();for(inti0;i10000000;i){StringstrString.valueOf(i).intern();list.add(str);}}}​运行结果​JDK 7 及以上java.lang.OutOfMemoryError: Java heap spaceJDK 6java.lang.OutOfMemoryError: PermGen space3. 三种字符串操作操作方式代码示例说明直接赋值String s zhuge;只会在常量池中创建new String()String s1 new String(zhuge);常量池和堆中都有对象intern 方法String s2 s1.intern();返回常量池中的引用4. 字符串常量池问题示例示例 1编译期优化Strings0zhuge;Strings1zhuge;Strings2zhuge;System.out.println(s0s1);// trueSystem.out.println(s0s2);// true​原理​zhu和ge都是字符串常量连接后也是字符串常量编译期就确定了。示例 2new String()创建Strings0zhuge;Strings1newString(zhuge);Strings2zhunewString(ge);System.out.println(s0s1);// falseSystem.out.println(s0s2);// falseSystem.out.println(s1s2);// false​原理​new String()创建的对象不在常量池中无法在编译期确定。示例 3编译期优化Stringaa1;Stringba1;System.out.println(ab);// trueStringaatrue;Stringbatrue;System.out.println(ab);// true​原理​JVM 在编译期将常量字符串连接优化为连接后的值。示例 4运行期动态连接Stringaab;Stringbbb;Stringbabb;System.out.println(ab);// false​原理​由于有字符串引用存在编译期无法确定需要在运行期动态连接。示例 5final 修饰Stringaab;finalStringbbb;Stringbabb;System.out.println(ab);// true​原理​final 变量在编译时被解析为常量值。示例 6方法返回值Stringaab;finalStringbbgetBB();Stringbabb;System.out.println(ab);// false​原理​方法返回值在编译期无法确定需要在运行期动态连接。5. String 不可变性​示例​Stringsabc;// 等价于String s abc;Stringaa;Stringbb;Stringcc;Strings1abc;// 不是abc而是通过StringBuilder拼接​JVM 指令码​StringBuildertempnewStringBuilder();temp.append(a).append(b).append(c);Stringstemp.toString();六、基本类型包装类与对象池1. 实现对象池的包装类Byte, Short, Integer, Long, Character, Boolean 实现了对象池技术在堆上。​特点​仅在值小于等于 127 时使用对象池一般较小的数值使用概率较大2. 浮点类型包装类Double 和 Float 没有实现对象池技术。3. 对象池示例publicclassTest{publicstaticvoidmain(String[]args){// 5种整型包装类在值小于127时使用对象池Integeri1127;// Integer.valueOf(127)Integeri2127;System.out.println(i1i2);// true// 值大于127不使用对象池Integeri3128;Integeri4128;System.out.println(i3i4);// false// new关键词创建对象不使用对象池Integeri5newInteger(127);Integeri6newInteger(127);System.out.println(i5i6);// false// Boolean实现对象池Booleanbool1true;Booleanbool2true;System.out.println(bool1bool2);// true// 浮点类型没有实现对象池Doubled11.0;Doubled21.0;System.out.println(d1d2);// false}}七、JVM 常量池与调优实战1. 字符串常量池优化建议​**避免使用 new String()**​除非确实需要在堆中创建新对象​**合理使用 intern()**​在需要确保唯一性时使用​注意字符串连接​小字符串连接在编译期优化大字符串连接在运行期优化2. 常量池调优建议​合理设置元空间大小​避免因元空间不足导致 Full GC​优化字符串常量池​​减少不必要的字符串创建​注意常量池对内存的影响​特别是大项目中常量池可能占用较多内存3. 实战案例​问题​某电商平台在高峰期出现 Full GC 频繁系统响应变慢。​分析​使用 Arthas 查看线程和内存通过 GC 日志分析发现元空间不足导致 Full GC使用 jmap 查看内存发现字符串常量池占用过大​优化​增大元空间XX:MetaspaceSize256M -XX:MaxMetaspaceSize256M优化字符串使用避免在循环中创建大量字符串优化代码减少不必要的字符串拼接​效果​Full GC 频率从每 5 分钟 1 次 → 每小时 1 次系统响应时间从 500ms → 200ms内存使用率从 80% → 60%八、总结与建议1. JVM 常量池核心要点​Class 常量池​​Class 文件中的资源仓库包含字面量和符号引用​运行时常量池​​Class 常量池被加载到内存后的形式​字符串常量池​​JVM 为字符串开辟的缓存区减少字符串创建开销​基本类型包装类​Byte、Short、Integer 等在小数值时使用对象池2. JVM 调优建议​了解应用特性​根据应用特点选择合适的 GC 算法​监控是基础​没有监控优化就是盲人摸象​分步优化​不要一次性调整太多参数逐步验证效果3. 重要提醒​默认参数已优化​JDK 8 的默认参数已考虑了大多数场景​不要过度调优​过度调优可能导致问题​测试环境验证​在生产环境实施前务必在测试环境验证效果“JVM 常量池和调优不是魔法而是有规律可循的系统。理解了常量池的原理、掌握了调优方法你就能在 Java 应用性能优化的道路上走得更远。”实战建议清单问题类型诊断方法解决方案Full GC 频繁GC 日志分析优化元空间大小调整 JVM 参数字符串占用高jmap 分析优化字符串使用减少不必要的创建常量池过大jmap 分析合理使用字符串常量避免重复创建对象池失效代码分析注意包装类的使用范围避免超出对象池范围​最后提醒​在实施 JVM 调优前务必在测试环境验证效果。一个错误的 JVM 参数可能导致生产环境严重问题而正确的优化能带来 10 倍性能提升。“当你能读懂 JVM 常量池原理、理解调优方法、掌握实战技巧你就真正掌握了 Java 应用的性能优化。从源码到执行这是一条充满智慧的道路。”

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询