Abel's tech blogAbel's tech blog
  • 基础知识
  • 面向对象
  • IO流
  • String
  • 异常处理机制
  • 多线程
  • 反射机制
  • JVM相关知识
  • 数据库基础
  • 数据库进阶
  • 复杂SQL语句
  • Redis
  • Spring-IOC
  • Spring-AOP
  • Spring-Test
  • SpringBoot
  • SpringMVC
  • MyBatis
  • 基于MyBatis的分页查询
  • SpringSecurity
  • 微服务概念
  • Nacos
  • Dubbo
  • Seata
  • Sentinel
  • SpringGateway网关
  • ELK
  • Quartz
  • 消息队列
  • 数据结构
  • 算法
  • TCP/IP
  • 交换机
  • 路由器
  • Docker
  • Kubernetes
  • Linux
  • 各类工具

    • 菜鸟工具
    • 菜鸟教程
    • IDEA下载
    • 数据结构和算法可视化网站
    • jwt解析
    • maven仓库
  • 开发文档

    • Java 8 API 文档
    • Java 17 API 文档
    • MyBatis 3 中文
    • MyBatis-spring 中文
    • Spring Framework 5 API DOC
    • Spring Framework 6 API DOC
    • SpringBoot 2.7.6 API DOC
    • SpringBoot 3 API DOC
    • Hypertext Transfer Protocol -- HTTP/1.0
  • 配置文件下载

    • 阿里云Maven仓库配置
    • Nginx反向代理配置模板
    • JavaScript组件库
  • JDK 8 Windows x86 64-bit
  • JDK 17 Windows x86 64-bit
  • Maven
  • IntelliJ IDEA 各版本
  • Git
  • 基础知识
  • 面向对象
  • IO流
  • String
  • 异常处理机制
  • 多线程
  • 反射机制
  • JVM相关知识
  • 数据库基础
  • 数据库进阶
  • 复杂SQL语句
  • Redis
  • Spring-IOC
  • Spring-AOP
  • Spring-Test
  • SpringBoot
  • SpringMVC
  • MyBatis
  • 基于MyBatis的分页查询
  • SpringSecurity
  • 微服务概念
  • Nacos
  • Dubbo
  • Seata
  • Sentinel
  • SpringGateway网关
  • ELK
  • Quartz
  • 消息队列
  • 数据结构
  • 算法
  • TCP/IP
  • 交换机
  • 路由器
  • Docker
  • Kubernetes
  • Linux
  • 各类工具

    • 菜鸟工具
    • 菜鸟教程
    • IDEA下载
    • 数据结构和算法可视化网站
    • jwt解析
    • maven仓库
  • 开发文档

    • Java 8 API 文档
    • Java 17 API 文档
    • MyBatis 3 中文
    • MyBatis-spring 中文
    • Spring Framework 5 API DOC
    • Spring Framework 6 API DOC
    • SpringBoot 2.7.6 API DOC
    • SpringBoot 3 API DOC
    • Hypertext Transfer Protocol -- HTTP/1.0
  • 配置文件下载

    • 阿里云Maven仓库配置
    • Nginx反向代理配置模板
    • JavaScript组件库
  • JDK 8 Windows x86 64-bit
  • JDK 17 Windows x86 64-bit
  • Maven
  • IntelliJ IDEA 各版本
  • Git

JVM内存结构

JVM内存结构

JVM调优

目的是降低full gc的触发频率

  1. 扩大这个堆内存空间
    • 会增加老年代的可用空间,可以降低full gc的触发频率
    • 到了老年代中存活时间不长的这些对象,尽可能在年轻代中被回收走,解决办法为扩大年轻代的内存,而扩大堆内存能达到这个效果
  2. 程序中尽量避免生成大对象
  3. 可以调整年轻代和老年代比较以及年轻代中三个区域的比例(不太建议)
  4. 更换GC位G1GC

GC的迭代

  1. SerialleGC 处理单线程程序
  2. ParalleGC 正对并行程序
  3. CMSGC 并发情况-从JDK1.5开始默认开启
  4. G1GC 从JDK1.9开始默认开启

如何调整堆内存大小,以及调整各年代之间的比例

  • 修改JVM堆大小方式: 找到IDEA安装目录下的-->bin-->idea.exe.vmoptions
-server
-Xms128m //堆初始大小
-Xmx512m //最大堆内存
-XX:ReservedCodeCacheSize=240m
-XX:+UseConcMarkSweepGC  //指定GC
-XX:SoftRefLRUPolicyMSPerMB=50-ea
-XX:CICompilerCount=2-Dsun.io.useCanonPrefixCache=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true  
堆配置    
    -Xms:初始堆大小    
    -Xmx:最大堆大小    
    -XX:NewSize=n:   设置年轻代大小
    -XX:NewRatio=n:  设置年轻代和年老代的比值,
  如:为3表示年轻代和年老代比值为1:3,年轻代占堆内存的1/4  
    -XX:SurvivorRatio=n: 年轻代中Eden区与两个Survivor区的比值。        
 注意Survivor区有两个。如3表示Eden:3 Survivor:2,   一个Survivor区占整个年轻代的1/5    
  -XX:MaxPermSize=n:设置永久代大小
       永久代:元空间
       
注意:修改完该文件后,idea启动项目发现修改不生效,此时需要修改配置环境以及一些设置.

GC常用算法

  1. 复制算法 -- minor gc使用的
  2. 标记-清除算法 缺点:可用的内存空间不连续,造成内存利用率不高
  3. 标记-整理算法 -- full gc使用的