当前位置: 首页 > news >正文

【调优】Java 调优学习笔记之字符串

一、紧凑字符串(Compact Strings)
  • 核心机制
    Java 9 引入 Compact Strings 特性(Java 11 默认开启 -XX:+CompactStrings),当字符串仅包含 Latin-1 字符(ASCII 范围,0-255) 时,使用 8 位字节数组(byte[] 存储;若包含非 Latin-1 字符,则仍使用 16 位字符数组(char[]
    ⚠️ 注意:Java 8 及之前版本统一使用 char[](每个字符占 2 字节,属于 16 位字符数组)。

  • 内存优化效果
    对于纯 Latin-1 字符串场景,Java 11 的内存占用约为 Java 8 的 75%(字符存储字节数减半)。在常规 Java 应用中,字符串可能占据堆内存的 50% 以上,因此优化效果显著。

二、重复字符串处理
1. 字符串去重(String Deduplication)
  • 开启条件

    • 自 Java 8 Update 20(JDK 8u20) 引入,需通过 -XX:+UseStringDeduplication 开启(默认 false)。
    • 必须搭配 G1 垃圾收集器(需添加 -XX:+UseG1GC),且仅对 老年代字符串 生效。
  • 未默认开启的原因

    1. GC 停顿时间增加:去重操作由 G1 回收线程在 新生代回收 或 混合回收阶段 同步执行,需扫描存活字符串并合并重复项,可能延长 STW(Stop The World)时间。
    2. 内存开销风险:若重复字符串较少,去重所需的 哈希表存储(记录唯一字符串) 和 元数据追踪 可能导致内存占用增加。
2. 字符串驻留(String.intern ())
  • 机制说明
    String.intern() 会将字符串存入 字符串常量池(位于 JVM 堆外的元空间),而非原生内存。

    • Java 8 及之后,常量池的哈希表初始大小为 60013(可通过 -XX:StringTableSize 调整为质数,如 1009、32791)。
    • 当存储的字符串数量超过哈希表容量时,会发生 哈希碰撞,碰撞的字符串以 链表 形式存储。
  • 性能隐患
    链表过长会导致 intern() 查询时间复杂度退化为 O (n),建议:

    • 避免在循环中频繁调用 intern()
    • 对长字符串或大量唯一字符串,慎用 intern()

补充说明

  • 分析工具

    • jmap -histo:live <pid>:分析堆中字符串实例数量及占比(java.lang.String 条目)。
    • -XX:+PrintStringDeduplicationStatistics:打印去重统计信息(如去重率、节省内存量)。
  • 参数调优示例

    # Java 11 调优参数示例(开启紧凑字符串、G1 GC、字符串去重)
    java -XX:+CompactStrings -XX:+UseG1GC -XX:+UseStringDeduplication -jar app.jar
http://www.xdnf.cn/news/594199.html

相关文章:

  • ollama接口数据返回格式化数据,商品标题,商品详情
  • 八、Linux进程和计划任务管理
  • 【Dify学习笔记】:dify通过ollama加载DeepSeek-R1-32B模型无法加载!终于解决了!!
  • C++ QT生成GIF,处理原始图像RGBA数据,窗口生成简单的动画
  • 练习小项目7:天气状态切换器
  • db_ha执行ha_isready报错authentication method 13 not supported
  • 同步/异步电路;同步/异步复位
  • 从法律视角看湖北理元理律师事务所的债务优化实践
  • Qt5、C++11 获取wifi列表与wifi连接
  • vue3商城类源码分享 期末作业 注册登录,状态管理,搜索,购物车订单页面
  • v3.0 YOLO篇-如何通过YOLO进行实验
  • Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么?
  • 比较连续型自变量和从连续型变量转换成了三分类变量的因变量的关系
  • Gitee PPM:智能化项目管理如何重塑软件工厂的未来格局
  • Scaled Dot-Product Attention 中的缩放操作
  • Spring Cloud生态与技术选型指南:如何构建高可用的微服务系统?
  • C语言:gcc 或 g++ 数组边界检查方法
  • 山东大学软件学院创新项目实训开发日志——第十二周
  • 2021~2025:特斯拉人形机器人Optimus发展进程详解
  • UV-python环境管理工具 入门教程
  • 时源芯微|电源、地线的处理
  • 技术篇-2.4.Python应用场景及开发工具安装
  • JMeter JDBC请求Query Type实测(金仓数据库版)
  • springboot3+vue3融合项目实战-大事件文章管理系统-本地存储及阿里云oss程序集成
  • 一文读懂Agent智能体,从概念到应用—Agent百科
  • GTM4.1-SPE
  • spring+tomcat 用户每次发请求,tomcat 站在线程的角度是如何处理用户请求的,spinrg的bean 是共享的吗
  • 练习写作对口语输出有显著的促进作用
  • Zephyr OS 中的互斥信号量
  • 高等数学-微分