立即前往

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 智算采购季 热销S6云服务器2核4G限时88元/年起,部分主机可加赠对象存储组合包!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 一键部署Llama3大模型学习机 0代码一键部署,预装最新主流大模型Llama3与StableDiffusion
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 产品能力
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
    • 关系数据库SQL Server版
    • 企业主机安全
    • 云防火墙
    • CDN加速
    • 物理机
    • GPU云主机
    • 天翼云电脑(政企版)
    • 天翼云电脑(公众版)
    • 云主机备份
    • 弹性云主机
      搜索发现
      关系数据库SQL Server版企业主机安全云防火墙CDN加速物理机GPU云主机天翼云电脑(政企版)天翼云电脑(公众版)云主机备份弹性云主机
    • 文档
    • 控制中心
    • 备案
    • 管理中心
    • 登录
    • 免费注册

    jvm专题(3) - 【2/3】GC实操

    首页 知识中心 其他 文章详情页

    jvm专题(3) - 【2/3】GC实操

    2023-05-19 02:20:27 阅读次数:107

    GC,jvm

    在实操作本章内容之前,请一定详细了解1/3章GC基础的内容,同时因为每个应用的情况不太一样,所以JVM调优没有一个统一的模式,只有深入了解其原理后才能进行调优操作。笔者大概罗列了一下JVM调优的必要过程:1、了解jvm原理;2、了解jvm相关参数;3、可读懂gc日志;4、上线压测。

    一、基础知识

    本节内容就是JVM调优时要修改的各种参数,笔者按垃圾回收器来进行分类,同时也常用的参数罗列一下,多数情况下在选定垃圾回收器类型后,只关注这些参数即可。

    1.1、GC 事件分类

    • Young GC:Young GC 每次都会引起全线停顿(Stop-The-World),暂停所有的应用线程,停顿时间相对老年代 GC 造成的停顿,几乎可以忽略不计;
    • Old GC:只清理老年代空间的 GC 事件,只有 CMS 的并发收集是这个模式;
    • Full GC:清理整个堆的 GC 事件,包括新生代、老年代、元空间等 ;
    • Mixed GC:清理整个新生代以及部分老年代的 GC,只有 G1 有这个模式;

    1.2、GC 调优目标

    • 响应速度(Responsiveness):响应速度指程序或系统对一个请求的响应有多迅速。比如,用户订单查询响应时间,对响应速度要求很高的系统,较大的停顿时间是不可接受的。调优的重点是在短的时间内快速响应;
    • 吞吐量(Throughput):吞吐量关注在一个特定时间段内应用系统的最大工作量。例如每小时批处理系统能完成的任务数量,在吞吐量方面优化的系统,较长的 GC 停顿时间也是可以接受的,因为高吞吐量应用更关心的是如何尽可能快地完成整个任务,不考虑快速响应用户请求​;

    1.3、优化方向

    • 将新生代留在新生代
    • 避免短命的大对象进入老年代

    1.4、GC评测指标

    GC 调优中,GC 导致的应用暂停时间影响系统响应速度,GC 处理线程的 CPU 使用率影响系统吞吐量。HotSpot 采用主动中断的方式,让执行线程在运行期轮询是否需要暂停的标志,若需要则中断挂起。需关注几个内存大小的设置和栈的设置大小(这会直接影响线程的个数)

    • 吞吐量:总运行时间-GC时间/100;
    • GC负载:GC时间/总运行时间;
    • 停顿时间:stop the world, 如果是并行回收器,可能会并行业务线程和GC线程其时间不一定比单线程回收器的时间;
    • GC回收频率:可以增大堆大小,但可能会增加stw时间;
    • 反应时间:回收时间

    性能表现方面,执行速度、内存分配、启动时间、负载承受能力。考核指标:执行时间、CPU时间、内存分配、磁盘吞量、网络吞量、响应时间,所以调优是一个遵循木桶理论的操作,需要综合考虑其它很多因素。进行优化时可以先计算下预期效果,运用Amdahl定律,公式为speedup(加速比) <= 1 /(F(串行化程序比重) + (1-F)/N )(处理器数量)。如果N趋近于无穷大,这时speedup = 1/F,所以程序优化时除了增加cpu来需要考虑并行化。

    二、优化前准备

    2.1、打印日志

    修改jvm启动参数,打印日志,以下配置只有第一行配置是必须的,其它都可选

    //开启的 JVM 启动参数如下
    -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps  -XX:+PrintGCTimeStamps
    
    //滚动 GC 日志文件
    -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m  
    
    //GC 日志文件重定向到内存文件系统
    -Xloggc:/dev/shm/mq_gc_%p.log

    2.2、禁止.gc()方法

    禁用的目的是防止人为因素的干扰(按道理来讲,gc()方法也应该在日常开发中被禁用)

    -XX:+DisableExplicitGC
    -Xnoclassgc:禁止gc时卸载类

    三、JVM配置

    整个jvm的配置或是调优主要就两大块内容,内存分配和垃圾回收器配置。多数情况下都是因为内存配置不合理引起的,只要内存设置合理很少出现需要修改垃圾回收器参数的情况。

    3.1、内存配置

    内存设置主要分为堆、栈、堆外内存三类,最重要的是堆内容的设置。详细如下:

    3.1.1、堆和栈内存设置

    ###堆内内存设置,一般是设置ratio
    -Xmx:设置堆最大值
    -Xms:设置堆最小值
    -Xmn:设置新生代大小,这个值过大会影响老年代大小, -XX:NewSize和-XX:MaxNewSize 设置初始新生代大小
    -XX:NewRatio:新老比例
    -XX:SurvivorRation:2个Survivor区和Eden区的比值,默认为8表示两个Survivor:Eden = 2:8 ,每个Survivor占 1/10
    -server -Xms1500m -Xmx1500m -XX:SurvivorRatio=3(survivor=210/2=105M,eden=90M) -XX:NewRatio=4(新生代1/5=300m,老年代4/5=1200m)
    ###栈内存设置
    -Xss:设置栈内存,这个值太大会影响并行线程数
    ###堆外内存设置
    -XX:PermSize:设置永生代初始化大小, -XX:MaxPermSize最大大小
    ###禁用偏向锁定可能会减少 JVM 暂停,需要在无线程竞争的情况下
    -XX:-UseBiasedLocking

    3.1.2、META元数据配置

    -XX:MetaspaceSize,初始空间大小(也是初始的阈值,即初始的high-water-mark):
    达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
    -XX:MaxMetaspaceSize,最大空间,默认是没有限制的,取决于本地系统空间容量。
    -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比(即元数据在当前分配大小的最大占用大小)
    如果空闲比小于这个参数(即超过了最大占用大小),那么将对meta space进行扩容。
    -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比(即元数据在当前分配大小的最小占用大小),
    如果空闲比大于这个参数(即小于最小占用大小),那么将对meta space进行缩容.

    3.2、垃圾回收器配置

    3.2.1、Serial 垃圾收集器(单线程、复制算法)

    适合比较简单的机器,效率会比并行的要好,新生代一般用复制,老年代一般用标记算法实现

    -XX:+UseSerialGC:指定新和老生代都使用串行回收器
    -XX:SurvivorRatio:设置eden和survivor区大小比例
    -XX:PretenureSizeThreshold:设置大对象直接进入老年代的值
    -XX:MaxTenuringThreshold:设置进入老年代的年龄,CMS默认是6,G1默认是15,在运行过程中会变化
    1. 设置过大:原本应该晋升对象到survivor区,直到survivor区溢出,一旦溢出发生,Eden+Svuvivor中对象将不再依据年龄全部提升到老年代,这样对象老化的机制就失效了.
    2. 设置过小:eden区的对象会陆续送入old区,对象移动本身就是开销,cms老年代回收还会造成碎片化。
    3. 这个参数一般与-XX:MaxTenuringThreshold=10 -XX:TargetSurvivorRatio=90 设定老年代阀值的上限为10,survivor空间目标使用率为90%

    3.2.2、ParNew垃圾收集器(Serial+多线程)

    -XX:+UseParNewGC:新生代并行,老年代串行
    -XX:+UseParallelGC:新生代并行,老年代串行
    -XX:+UseParallelOldGC:老新生代都使用并行
    -XX:ParallelGCThreads:设置线程数,一般小于CPU核心数
    -XX:MaxGCPauseMillis:设置最大STW时间
    -XX:GCTimeRatio:设置吞量大小
    -XX:+UseAdaptiveSizePolicy:GC自适应策略,它会自动调JVM堆参数;

    3.2.3、CMS收集器(多线程标记清除算法)

    可控制STW时间,采用标记清除算法

    -XX:UseConcMarkSweepGC:新手代并行,老年代CMS
    -XX:ParallelCMSThreads:设置线程数,也可以用(-XX:ParallelGCThreads+3)/4来代替
    -XX:CMSInitiatingOccupancyFraction:触发CMS老年代的阈值,默认68%
    -XX:+UseCMSCompactAtFullCollection:CMS-GC后是否进行一次碎片整理
    -XX:CMSFullGCsBeforeCompaction:CMS-GC后是否进行一次内存压缩
    -XX:+CMSClassUnloadingEnabled:是否回收元数据
    -XX:CMSInitiatingPermOccupancyFraction:CMSClassUnloadingEnabled开启后触发的内存比率

    3.2.4、G1回收器

    采用标记压缩算法,不会产生碎片,同时可控制STW时间,

    -XX:+UseG1GC:使用G1回收器
    -XX:MaxGCPauseMillis:最大STW时间,如果值设置太小JVM 会使用一个小的年轻代来实现这个目标,这会导致非常频繁的 Minor GC
    -XX:G1HeapRegionSize=16m 
    -XX:G1ReservePercent=25 
    -XX:InitiatingHeapOccupancyPercent=30

    四、GC日志分析

    gc调优最直接的方式是日志分析。所以首先要了解日志格式:

    4.1、日志格式

    4.1.1、young GC日志

    jvm专题(3) - 【2/3】GC实操

    ​

    4.1.2、full gc日志

    jvm专题(3) - 【2/3】GC实操

    4.2、分析过程

    4.2.1、Young GC (Allocation Failure)

    GC (Allocation Failure)造成的young gc。Allocation Failure表示向young generation(eden)给新对象申请空间,但是young generation(eden)剩余的合适空间不够所需的大小导致的minor gc。

    4.2.1.1、-XX:+PrintTenuringDistribution
    - age 年龄: 处于当前年龄段的对象大小 总大小(各个年龄段是累计的),
    这个Desired survivor size表示survivor区域允许容纳的最大空间大小为75497472 bytes,这个值*10就是整个年轻化大小,*8=eden区大小;
    Desired survivor size 75497472 bytes, new threshold 15 (max 15)
    - age 1: 19321624 bytes, 19321624 total
    - age 2: 79376 bytes, 19401000 total
    - age 3: 2904256 bytes, 22305256 total
    ————————————————
    一次 GC 后幸存对象大约 19 MB, 两次GC 后幸存对象大约79 KB , 三次GC 后幸存对象大约 3 MB .
    每行结尾,显示直到本年龄全部对象大小.所以,最后一行的 total 表示幸存区To 总共被占用22 MB . 
    幸存区To 总大小为 75 MB ,当前老年代阀值为15,可以断定在本次GC中,没有对象会移动到老年代。
    现在假设下一次GC 输出为:
    Desired survivor size 75497472 bytes, new threshold 2 (max 15)
    - age   1:   68407384 bytes,   68407384 total
    - age   2:   12494576 bytes,   80901960 total
    - age   3:      79376 bytes,   80981336 total
    - age   4:    2904256 bytes,   83885592 total
    age=1的对象占了68407384, age=2占了12494576,一直到age=4,共占了83885592大小。上述表示经过2次GC,部分对象进入了老年代
    • 明显的,年龄2和年龄3 的对象还保持在幸存区中,因为我们看到年龄3和4的对象大小与前一次年龄2和3的相同。同时发现幸存区中,有一部分对象已经被回收,因为本次年龄2的对象大小为 12MB 最近的GC中,有68 MB 新对象,从伊甸园区移动到幸存区。本次GC 幸存区占用总大小 84 MB -大于75 MB. 结果,JVM 把老年代阀值从15降低到2,在下次GC时,一部分对象会强制离开幸存区,这些对象可能会被回收(如果他们刚好死亡)或移动到老年代。
    4.2.1.2、age list为空
    59.463: [GC (Allocation Failure) 
    Desired survivor size 134217728 bytes, new threshold 7 (max 15)
    [PSYoungGen: 786432K->14020K(917504K)] 804872K->32469K(1966080K), 0.1116049 secs] [Times: user=0.10 sys=0.01, real=0.20 secs]
    这里Desired survivor size这行下面并没有各个age对象的分布,那就表示此次gc之后,当前survivor区域并没有age小于max threshold的存活对象。
    而这里一个都没有输出,表示此次gc回收对象之后,没有存活的对象可以拷贝到新的survivor区。
    2016-08-23T02:23:07.219-02001: 64.3222:[GC3(Allocation Failure4) 64.322:
     [ParNew5: 613404K->68068K6(613440K)7, 0.1020465 secs8] 10885349K->10880154K9(12514816K)10, 0.1021309 secs11]
     [Times: user=0.78 sys=0.01, real=0.11 secs]12
    开始的时候:整个堆的大小是 10885349K,年轻代大小是613404K,这说明老年代大小是 10885349-613404=10271945K,
    收集完成之后:整个堆的大小是 10880154K,年轻代大小是68068K,这说明老年代大小是 10880154-68068=10812086K,
    老年代的大小增加了:10812086-10271945=608209K,也就是说 年轻代到年老代promot了608209K的数据;
    4.2.1.3、gc之后survivor有对象的例子
    jstat -gcutil -h10 7 10000 10000
      S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
      0.00  99.99  90.38  29.82  97.84  96.99    413  158.501     4   14.597  173.098
     11.60   0.00  76.00  29.83  97.84  96.99    414  158.511     4   14.597  173.109
     11.60   0.00  77.16  29.83  97.84  96.99    414  158.511     4   14.597  173.109
      0.00  13.67  60.04  29.83  97.84  96.99    415  158.578     4   14.597  173.176
      0.00  13.67  61.05  29.83  97.84  96.99    415  158.578     4   14.597  173.176
    • 在ygc之前young generation = eden + S1;ygc之后,young generation = eden + S0
    • 观察可以看到ygc之后old generation空间没变,表示此次ygc,没有对象晋升到old generation。
    • gc之后,存活对象搬移到了另外一个survivor区域
    • 这里由于是每个10秒采样一次,存在延迟,即gc之后,立马有新对象在eden区域分配了,因此这里看到的eden区域有对象占用。

    4.2.2、Full/Major GC

    1、2016-08-23T11:23:07.321-0200: 64.425: [GC (CMS Initial Mark)1 [1 CMS-initial-mark: 10812086K(11901376K)] 10887844K(12514816K), 0.0001997 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
    /*2016-08-23T11:23:07.321-0200: 64.42 – GC事件开始,包括时钟时间和相对JVM启动时候的相对时间,下边所有的阶段改时间的含义相同;
    CMS Initial Mark – 收集阶段,开始收集所有的GC Roots和直接引用到的对象;
    10812086K – 当前老年代使用情况;
    (11901376K) – 老年代可用容量;
    10887844K – 当前整个堆的使用情况;
    (12514816K) – 整个堆的容量;
    0.0001997 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] – 时间计量;
    */上面是第一次STOP the world
    2016-08-23T11:23:07.321-0200: 64.425: [CMS-concurrent-mark-start]
    2016-08-23T11:23:07.357-0200: 64.460: [: 0.035/0.035 secs] [Times: user=0.07 sys=0.00, real=0.03 secs]
    //035/0.035 secs – 展示该阶段持续的时间和时钟时间;
    2016-08-23T11:23:07.357-0200: 64.460: [CMS-concurrent-preclean-start]
    2016-08-23T11:23:07.373-0200: 64.476: [CMS-concurrent-preclean3: 0.016/0.016 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
    2016-08-23T11:23:07.373-0200: 64.476: [CMS-concurrent-abortable-preclean-start]
    2016-08-23T11:23:08.446-0200: 65.550: [CMS-concurrent-abortable-preclean4: 0.167/1.074 secs] [Times: user=0.20 sys=0.00, real=1.07 secs]
    //0.016/0.016 secs – 展示该阶段持续的时间和时钟时间;
    2016-08-23T11:23:08.447-0200: 65.550: [GC (CMS Final Remark5)
    //这个阶段是CMS中第二个并且是最后一个STW的阶段
    [YG occupancy: 387920 K (613440 K)]65.550: [Rescan (parallel) , 0.0085125 secs]65.559: 
    [weak refs processing, 0.0000243 secs]65.559: [class unloading, 0.0013120 secs]65.560: 
    [scrub symbol table, 0.0008345 secs]65.561: [scrub string table, 0.0001759 secs][1 CMS-remark: 10812086K(11901376K)] 11200006K(12514816K), 0.0110730 secs] 
    [Times: user=0.06 sys=0.00, real=0.01 secs]
    2016-08-23T11:23:08.447-0200: 65.550 – 同上;
    CMS Final Remark – 收集阶段,这个阶段会标记老年代全部的存活对象,包括那些在并发标记阶段更改的或者新创建的引用对象;
    YG occupancy: 387920 K (613440 K) – 年轻代当前占用情况和容量;
    [Rescan (parallel) , 0.0085125 secs] – 这个阶段在应用停止的阶段完成存活对象的标记工作;
    weak refs processing, 0.0000243 secs]65.559 – 第一个子阶段,随着这个阶段的进行处理弱引用;
    class unloading, 0.0013120 secs]65.560 – 第二个子阶段(that is unloading the unused classes, with the duration and timestamp of the phase);
    scrub string table, 0.0001759 secs – 最后一个子阶段(that is cleaning up symbol and string tables which hold class-level metadata and internalized string respectively)
    10812086K(11901376K) – 在这个阶段之后老年代占有的内存大小和老年代的容量;
    11200006K(12514816K) – 在这个阶段之后整个堆的内存大小和整个堆的容量;
    0.0110730 secs – 这个阶段的持续时间;
    [Times: user=0.06 sys=0.00, real=0.01 secs] – 同上;
    2016-08-23T11:23:08.458-0200: 65.561: [CMS-concurrent-sweep-start]
    2016-08-23T11:23:08.485-0200: 65.588: [CMS-concurrent-sweep6: 0.027/0.027 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
    2016-08-23T11:23:08.485-0200: 65.589: [CMS-concurrent-reset-start]
    2016-08-23T11:23:08.497-0200: 65.601: [CMS-concurrent-reset7: 0.012/0.012 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

    五、程序优化的常用手段

    本小节列出常用的程序方面的优化方法:

    • 缓冲:
    • 缓存:
    • 池:
    • 并行替代串行:
    • 负载均衡:
    • 时间换空间&空间换时间:这种优化手段是要充分考虑机器配置。

    5.1、java程序优化

    其实就是强、弱引用等问题

    5.1.1、String

    1、对于大字符串少用subString(),而用下列代码代替:

    public String getSubString(int begin, int end){
        //这处返回了新的字符串,返回了一个新字符串,切断了原来的强引用,使内存更容易被回收;
        return new String(str.substring(begin, end));
    }

    2、使用StringTokenizer代替原来的split,但影响是会占用大量的内存空间,好处是节省了时间

    public static void Stringsplid(String str){
        StringTokenizer st = new StringTokenizer(str, ",");
        while (st.hasMoreTokens()){
            System.out.println(st.nextToken());
        }
    }

    3、用多个charAt()代替startWidth(),效率大概高一倍左右吧

    if (orgStr.charAt(0) == 'a' && orgStr.charAt(1) == 'b')

    4、对超大string操作或者是循环操作时,也会涉及到+和stringbuilder的选择,少量的数据时JVM会自动优化成StringBuilder。

    //无线程要求的前提下用StringBuilder,在有线程安全要求的前提下使用StringBuffer.

    5、指定StringBuilder和StringBuffer需要指定容量,防止频繁扩容,默认大小是16字节

    5.1.2、编程技巧

    • 用nio代替io
    • 4种引用类型使用
    • 局部变量代替全局变量(提速)
    • 位运算代替四则运算
    • 轻量级的对象用clone()代替new,因为clone会跳过构造函数

    5.1.3、线程

    • 线程池大小经验公式: N = Ncpu * Ucpu * (1+W/C)
    • Ncpu:cpu的数量
    • Ucpu:目标cpu的使用率
    • W/C:等待时间与计算时间的比率;
    ThreadPool:最简单的线程池,没大用
    Executor框架:固化了4种不同类型的线程池
    ThreadPoolExecutor:自定义线程池
    -XX:-UseBiasedLocking:偏向锁(如果程序没有竞争,则取消之前已经取得锁的线程同步操作),大多数时应该关掉此参数
    协程:这是一个概念,其实就是线程的分割,提高并行度(类似进程分割成线程),也可一个Kilim的框架

    六、附

    版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/arch/5276135,作者:生而为人我很遗憾,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

    上一篇:ElasticSearch文档路由

    下一篇:java基础 - 序列化

    相关文章

    2025-04-14 08:45:56

    java学习第十一天笔记-字符串222-学生管理系统4查询

    java学习第十一天笔记-字符串222-学生管理系统4查询

    2025-04-14 08:45:56
    i++ , java , jvm , System , 学习
    2025-04-01 10:28:48

    java中satb和tlab有什么区别?

    java中satb和tlab有什么区别?

    2025-04-01 10:28:48
    Java , jvm , JVM , 内存空间
    2025-03-17 07:49:59

    jvm内存堆栈监控之jmap篇

    jvm内存堆栈监控之jmap篇

    2025-03-17 07:49:59
    heap , jvm , 内存
    2025-03-11 09:34:18

    【java虚拟机】JVM知识框架快速一览

    【java虚拟机】JVM知识框架快速一览

    2025-03-11 09:34:18
    GC , JVM , 内存 , 对象 , 方法
    2025-03-04 09:11:34

    查看rancher中debug端口信息,并做IDEA Remote Jvm Debug

    查看rancher中debug端口信息,并做IDEA Remote Jvm Debug

    2025-03-04 09:11:34
    debug , Debug , IDEA , jvm , 断点
    2025-01-16 09:30:08

    java基础(1)

    java基础(1)

    2025-01-16 09:30:08
    java , JAVA , jsp , jvm , php , 动态 , 客户端
    2024-12-16 09:17:45

    JVM体系结构的详细阐述

    JVM体系结构的详细阐述

    2024-12-16 09:17:45
    GC , Java , 内存 , 加载 , 方法
    2024-10-25 07:15:55

    Java服务端性能优化:JVM垃圾回收策略

    Java 虚拟机(JVM)是 Java 程序运行的基础,而垃圾回收(GC)是 JVM 管理内存的核心机制之一。垃圾回收策略的选择和优化对 Java 服务端性能有着直接的影响。本文将探讨 JVM 垃圾回收的基本原理,介绍几种常见的垃圾回收策略,并提供一些优化建议。

    2024-10-25 07:15:55
    GC , 回收 , 垃圾
    2024-09-25 10:15:15

    jvm专题(4) - 【1/3】多线程-基础知识

    jvm专题(4) - 【1/3】多线程-基础知识

    2024-09-25 10:15:15
    jvm , 多线程
    2024-09-25 10:14:48

    JOL学习

    JOL(Java Object Layout)是一个开源的 Java 库,用于深入了解和分析 Java 对象的内存布局。它提供了一组工具和API,可以用于查看对象的内部结构、字段排列顺序、内存对齐等信息,以及计算对象的大小和对齐方式。

    2024-09-25 10:14:48
    java , jvm , 学习
    查看更多
    推荐标签

    作者介绍

    天翼云小翼
    天翼云用户

    文章

    32777

    阅读量

    4816517

    查看更多

    最新文章

    查看rancher中debug端口信息,并做IDEA Remote Jvm Debug

    2025-03-04 09:11:34

    JOL学习

    2024-09-25 10:14:48

    java swing中的卡片布局

    2024-09-25 10:13:34

    【java基础】泛型的通配符(extends,super,?)

    2024-09-24 06:30:37

    KVM和JVM的虚拟化技术有何区别?

    2024-06-07 07:41:34

    聊聊指令重排序

    2024-06-07 07:39:41

    查看更多

    热门文章

    GC是什么? 为什么要有GC?

    2023-05-10 06:02:16

    java学习第一天笔记-java基础概念01-注释17

    2023-03-08 10:52:50

    java学习第一天笔记-java基础概念04-字面量2-基本用法21

    2023-03-14 09:34:35

    全网详细解决java.lang.ClassCastException: xxx类型 cannot be cast to xxx类型

    2023-07-11 08:45:04

    【java基础】泛型的限制及其继承规则

    2023-07-03 08:06:07

    【java基础】抽象类和抽象方法

    2023-07-03 08:06:20

    查看更多

    热门标签

    linux java python javascript 数组 前端 docker Linux vue 函数 shell git 容器 spring 节点
    查看更多

    相关产品

    弹性云主机

    随时自助获取、弹性伸缩的云服务器资源

    天翼云电脑(公众版)

    便捷、安全、高效的云电脑服务

    对象存储

    高品质、低成本的云上存储服务

    云硬盘

    为云上计算资源提供持久性块存储

    查看更多

    随机文章

    jvm(4)

    【java基础】继承(extends)

    介绍volatile功能。

    JVM中的方法区

    hutool工具包的实用方法简单介绍

    【java基础】一篇文章彻底搞懂java反射

    • 7*24小时售后
    • 无忧退款
    • 免费备案
    • 专家服务
    售前咨询热线
    400-810-9889转1
    关注天翼云
    • 权益商城
    • 天翼云APP
    • 天翼云微信公众号
    服务与支持
    • 备案中心
    • 售前咨询
    • 智能客服
    • 自助服务
    • 工单管理
    • 客户公告
    • 涉诈举报
    账户管理
    • 管理中心
    • 订单管理
    • 余额管理
    • 发票管理
    • 充值汇款
    • 续费管理
    快速入口
    • 权益商城
    • 文档中心
    • 最新活动
    • 免费试用
    • 信任中心
    • 天翼云学堂
    云网生态
    • 甄选商城
    • 渠道合作
    • 云市场合作
    了解天翼云
    • 关于天翼云
    • 天翼云APP
    • 服务案例
    • 新闻资讯
    • 联系我们
    热门产品
    • 云电脑
    • 弹性云主机
    • 云电脑政企版
    • 天翼云手机
    • 云数据库
    • 对象存储
    • 云硬盘
    • Web应用防火墙
    • 服务器安全卫士
    • CDN加速
    热门推荐
    • 云服务备份
    • 边缘安全加速平台
    • 全站加速
    • 安全加速
    • 云服务器
    • 云主机
    • 智能边缘云
    • 应用编排服务
    • 微服务引擎
    • 共享流量包
    更多推荐
    • web应用防火墙
    • 密钥管理
    • 等保咨询
    • 安全专区
    • 应用运维管理
    • 云日志服务
    • 文档数据库服务
    • 云搜索服务
    • 数据湖探索
    • 数据仓库服务
    友情链接
    • 中国电信集团
    • 189邮箱
    • 天翼企业云盘
    • 天翼云盘
    ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
    公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
    • 用户协议
    • 隐私政策
    • 个人信息保护
    • 法律声明
    备案 京公网安备11010802043424号 京ICP备 2021034386号