首页 > 其他分享 >JVM 入门

JVM 入门

时间:2023-06-20 11:02:17浏览次数:47  
标签:入门 新生代 默认 XX gc JVM 参数


JVM 区域划分

  • JVM 内存大小 = 堆 + 非堆
  • 组成
  • 堆由三部分组成, Eden(伊甸园), SurFrom and SurTo(幸存者), Ten(老年区). 注: Sur 0/1 和 Sur From/To 是一回事
  • 非堆由三部分组成, metaspace(元空间), codeCache, ClassSpace
  • 比例
  • 老年代 : 年轻代 = 2 :1
  • eden:surFrom:surTo = 8:1:1
  • 文档中常见 方法区, 持久带, 这两个是等价的, 并且已经在 jdk8 中移除, 由 metaspace 替代

JVM 入门_老年代


JVM 内存及GC介绍

内存介绍

  • 创建的对象会优先进入 Eden, 除以下情况
  • 设置 MaxTenuringThreshold 为 0
  • 如果在新生代分配失败且对象是一个不含任何对象引用的大数组,可被直接分配到老年代
  • 当 Eden 空间不足时, 进行一次 YGC, 未被回收的对象进入 Sur
  • 经过一次 YGC, Sur 中的对象年龄会+1
  • 一般情况下年龄为 15 会进入老年区
  • 特殊情况, 当同年龄的对象总大小超过 sur 的空间一半, 也会从 sur 进入 old
  • 当 old 区域不足时, 进行一次 FGC

GC

  • YGC: 当 eden 大小不够时, 进行 YGC
  • FGC: 当 老年区 大小不够时, 进行 FGC

图示


参数

分类

  • 标准参数
  • X参数, 使用 java -x 检索, 非标参数
  • XX参数, 调试参数
  • 所有的XX参数都以”-XX:”开始, 但是随后的语法不同, 取决于参数的类型
  • 对于布尔类型的参数, 我们有+和-, 然后才设置JVM选项的实际名称. 例如, -XX:+用于激活选项, 而-XX:-用于注销
  • 对于需要非布尔值的参数, 如string或者integer, 我们先写参数的名称, 后面加上=后赋值. 例如, -XX:=给赋值

示例

// 堆
-Xms // 堆的初始大小, 默认情况下是物理内存的 1/64, 等价于 -XX:InitialHeapSize
-Xmx // 堆的最大大小, 默认情况是物理内存的 1/4, 等价于 -XX:MaxHeapSize
 
-XX:NewSize // 新生代初始大小, 是堆的一部分, 此时老年代就是 Xmx-该数值, 一般不允许新生代比老年代还大
-XX:MaxNewSize // 新生代最大大小
 
-XX:SurvivorRatio // 指定 eden 和 sur 的大小比例, 默认为 8, 即 8:1:1
-XX:NewRatio // 设置老生代和新生代的比例, 默认为 2, 即新生代:老生代=1:2
 
// 晋升老年代
-XX:InitialTenuringThreshold // 初始对象晋升老年代的阈值, 默认为 7
-XX:MaxTenuringThreshold // 晋升老年代的年龄阈值, 默认 15, 超过这个直接进入老年代
-XX:-UseAdaptiveSizePolicy // 若关闭动态计算规则, 则恒定以 MaxTenuringThreshold 为晋升规则
-XX:TargetSurvivorRatio // 设置幸存区的目标使用率, 默认 50, 即 50%
 
// 元空间(非堆)
-XX:MetaspaceSize // 元空间触发 gc 阈值
-XX:MaxMetaspaceSize // 元空间最大值
 
MinMetaspaceFreeRatio // 默认 40, 即 40%, 空闲比例小于这个参数, 则会扩大 metaspace
MaxMetasaceFreeRatio // 默认 70, 即 70%, gc 后, 空闲比例大于这个参数, 则会缩小 metaspace
MaxMetaspaceExpansion // 增长的最大幅度, 默认约 5M
MinMetaspaceExpansion // 增长的最小幅度, 默认约 300K
 
// 堆外
-XX:MaxDirectMemerySize // 对外内存限制
-XX:-DisableExplicitGC // 取消 禁用System.gc()
 
// gc log
-XX:+PrintGC // 简单 gc log
-XX:+PrintGCDetails // 信息 gc log
 
-XX:+PrintGCTimeStamps // 添加时间戳, 自 java 启动开始
-XX:+PrintGCDateStamps // 添加日期和时间
 
UseParNewGC // 并行进行 YGC, 单核效果不大
// oom dump
-XX:+HeapDumpOnOutOfMemoryError // oom 自动生成 dump 文件
-XX:HeapDumpPath=<path> // 生成 dump 文件路径
-XX:OnOutOfMemoryError=<cmd> // oom 执行一条命令
 
// 其他
-XX:+PrintTenuringDistribution // 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
-XX:+UnlockDiagnosticVMOptions
-XX:+PrintNMTStatistics


标签:入门,新生代,默认,XX,gc,JVM,参数
From: https://blog.51cto.com/u_16165803/6521284

相关文章

  • Python开发系列课程(18) - 网络编程入门
    网络编程入门计算机网络基础计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享。今天计算机网络中的设备和计算机网络的用户已经多得不可计数,而计算机网络也可以称得上是一个“复杂巨系统”,对于这样的系统,我们不可......
  • ASP.NET Core MVC 从入门到精通之日志管理
    随着技术的发展,ASP.NETCoreMVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NETCoreMVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NETCoreMVC系统开发的人员。经过前几篇文章的讲解,初步了解ASP.NETCore......
  • MySQL入门基础知识
    1MySQL基础1.1常用命令启动服务:netstart服务名停止服务:netstop服务名启动MySQL服务器:MySQL【-h主机名-P端口号】-u用户名-p密码查看MySQL版本:MySQL--version或MySQL–V或登录到MySQL服务端使用selectversion();1.2语法规范每条命令最好用分号结尾每条......
  • JVM监控工具jstat使用介绍
    jstat是Java自带的一个命令行工具,用于监控JVM运行时的状态信息。它可以通过以下格式的命令来调用:jstat[option]<vmid>[<interval>[<count>]]其中,option表示需要查询的信息类型,如-gc,-class,-compiler等;vmid表示目标JVM的进程ID或者进程名;interval表示查询......
  • SpringBoot整合cache缓存入门
    目的:缓存可以通过将经常访问的数据存储在内存中,减少底层数据源如数据库的压力,从而有效提高系统的性能和稳定性。一、启用缓存@EnableCaching 我们需要在启动类上添加注解@EnableCaching来开启缓存功能。 示例代码如下:importorg.springframework.boot.SpringApplication;impor......
  • Python中的DYNAMIXEL快速入门指南
    原文链接:https://www.youtube.com/watch?v=LAizFTTdL8o hisvideowillbecoveringtherequiredcomponentsandhardware&softwaresetup,andfinallyruntheDYNAMIXELinPythonwithDYNAMIXELSDKwithinjustafewMINUTES. 本视频将涵盖所需的组件和硬件、软......
  • 全栈测试开发系列----Selenium简介安装入门
     本章将使用当前最新的Python3和Selenium3作为Web自动化测试框架开发基础。既然是自动化脚本的开发,那么一切都需要多实践,需要动手敲下每一个实例中的每行代码,然后根据实际项目举一反三,就绝对可以有信心地跟别人说:“Selenium!SoEasy!”知识点:HTML技术:了解一个H......
  • kubernetes入门
    一、kubernetes简介kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了应用部署,规划,更新,维护的一种机制。kubernetes的目标是让部署容器化的应用简单并且高效(powerful),kubernetes提供了......
  • 学不动也要学,Jetpack Compose入门到入坟
    前言在2019年的Google/IO大会上,亮相了一个全新的Android原生UI开发框架JetpackCompose。与IOS的SwiftUI一样,JetpackCompose也是一个声明式的UI框架,随着Android和IOS两大移动平台相继推出了自己平台专属的声明式UI框架,标志着整个行业已开始转向声明性界面模......
  • Jetpack组件库(含Jetpack Compose)从入门到精通全家桶【附Demo】
    前言开发应用程序就像搭积木。我们对产品业务及功能模块的划分和封装,就像在搭建积木一样。积木不能太大,这不利于修改和拆解;积木也不能太小,否则管理起来可能会很混乱。只有基于稳健、合理的架构,项目才能轻松应对需求的变化,才有可能健康成长。没有良好架构的应用程序,就像没有搭好底......