• 垃圾回收调优(GC调优)


     性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。 架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。

    实际上,优先架构调优和代码调优,JVM优化是不得已的手段,大多数的Java应用不需要进行JVM优化

     

     先介绍三个概念:

      吞吐量:用户代码执行时间/(用户代码执行时间+GC执行时间)。

      暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间;

      内存占用:java堆区所占的内存大小

    我们进行JVM调优的目的可以有很多,比如说:

    • Heap 内存使用率 <= 70%;
    • Old generation内存使用率<= 70%;
    • avgpause <= 1秒;
    • Full gc 次数0 或 avg pause interval >= 24小时 ;

    -Xms 堆初始大小

    -Xmx 最大堆大小

    -Xmn 新生代大小

    -XX:NewRatio  新生代和老年代的比例

    -XX:+PrintGCDetails 查看详细的GC处理日志

    -XX:+HeapDumpOnOutOfMemoryError 出现异常时输出堆内信息,这个一般要配合:                           -XX:HeapDumpPath=******使用,指定输出路径

    比如:-Xms5M  -Xmx5M  -Xmn1M  -XX:SurvivorRatio=8  -XX:HeapDumpPath=/usr/local/gc.hprof

    其他常有的还有-Xss 设置栈大小,如果不设置,默认值为1M

    1.堆设置:

    -Xms 堆初始大小

    -Xmx 最大堆大小

    通常设置为相同的值,避免运行时要不断扩展JVM内存

    2.新生代设置

    -Xmn

    避免新生代设置过小,当新生代设置过小时,会带来两个问题:一是minor GC次数频繁,二是可能导致 minor GC对象直接进老年代(老年代对象太多会触发Full GC)

    避免新生代设置过大,当新生代设置过大时,会带来两个问题:一是老年代变小,可能导致Full GC频繁执行;二是 minor GC 执行回收的时间大幅度增加。

    3.老年代设置

    一般吞吐量优先的应用都有一个较大的年轻代和一个较小的老年代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽可能存放长期存活对象

    4.方法区设置

    基于jdk1.7版本,永久代:参数-XX:PermSize和-XX:MaxPermSize;

    基于jdk1.8版本,元空间:参数 -XX:MetaspaceSize和-XX:MaxMetaspaceSize;

    通常设置为相同的值,避免运行时要不断扩展

  • 相关阅读:
    7-3 投票统计 武汉理工大学C语言
    IEEE Transaction期刊修改过程记录
    Java常见ID生成方式比较
    Elasticsearch 如何实现时间差查询?
    【JSP】EL表达式
    计算机基础知识52
    软件流程和管理(四):PMP & Stakeholder Management
    2023年了,为何 Selenium 依然这么火?
    一次搞懂SpringBoot核心原理:自动配置、事件驱动、Condition
    基于promiseAPlus 实现 Promise
  • 原文地址:https://blog.csdn.net/weixin_47414034/article/details/127671882