前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >进阶2:JVM 启动参数

进阶2:JVM 启动参数

原创
作者头像
你可以叫我老白
发布2023-06-28 15:56:35
4680
发布2023-06-28 15:56:35
举报
文章被收录于专栏:我的技术我的技术

前言:这堂课程不用过多的记忆,自身有印象即可。一些常用的最好还是了解一些比较好。

jvm启动参数

JVM(Java虚拟机)的启动参数是在启动JVM时可以设置的一些命令行参数。这些参数用于指定JVM的运行环境、内存分配、垃圾回收器以及其他选项。以下是一些常见的JVM启动参数:

  1. -Xms:设置JVM的初始堆大小。
  2. -Xmx:设置JVM的最大堆大小。
  3. -Xss:设置每个线程的栈大小。
  4. -XX:MaxMetaspaceSize:设置元空间(在JDK8之后替代了永久代)的最大大小。
  5. -XX:PermSize:设置永久代的初始大小。
  6. -XX:MaxPermSize:设置永久代的最大大小(在JDK8之前使用)。
  7. -XX:NewSize:设置新生代的初始大小。
  8. -XX:MaxNewSize:设置新生代的最大大小。
  9. -XX:SurvivorRatio:设置Eden区和Survivor区的比例。
  10. -XX:+UseParallelGC:使用并行垃圾回收器。
  11. -XX:+UseConcMarkSweepGC:使用并发标记清除垃圾回收器。
  12. -verbose:gc:打印GC日志信息。
  13. -Dproperty=value:设置系统属性。

这些启动参数可以通过在命令行中使用"java"命令时添加参数来设置。例如:"java -Xms256m -Xmx512m -jar myapp.jar"将设置JVM的初始堆大小为256MB,最大堆大小为512MB,并运行名为"myapp.jar"的Java应用程序。

idea使用

编辑切换为居中

添加图片注释,不超过 140 字(可选)

参数分类

编辑

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

1. 以 - 开头为标准参数,所有的 JVM 都要实现这些参数,并且向后兼容,如 -server。 2. -D 设置系统属性,如 -Dfile.encoding=UTF-8。 3. 以 -X 开头为非标准参数,基本都是传给 JVM 的,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容。 可以使用 java -X 命令来查看当前 JVM 支持的非标准参数,如 -Xmx8g。 4. 以 –XX:开头为非稳定参数, 专门用于控制 JVM 的行为,跟具体的 JVM 实现有关,随时可能会在下个版本取消。 -XX:±Flags 形式, ± 是对布尔值进行开关,如 -XX:+UseG1GC。 -XX:key=value 形式, 指定某个选项的值,如 -XX:MaxPermSize=256m。

JVM启动参数使用中常见的错误:

java.lang.OutOfMemoryError相信很多开发人员都用到过,这个主要就是JVM参数没有配好引起的,但是这种错误又分两种:java.lang.OutOfMemoryError:Javaheapspace和java.lang.

OutOfMemoryError:PermGenspace,其中前者是有关堆内存的内存溢出,可以同过配置-Xms和-Xmx参数来设置,而后者是有关永久域的内存溢出,可以通过配置-XX:MaxPermSize来设置。

系统属性

编辑切换为居中

添加图片注释,不超过 140 字(可选)

其他语言不清楚,但是作为java中,无论你去哪个公司,只要是使用新的电脑。工作第一个本职工作一般都是配置系统环境变量。比如我们的jdk等,服务器部署也是一样的。

这里我们可以使用System.getProperty("")方法来进行配置,现在很少了。了解即可。

java -D 配置系统属性 使用案例 其实,在不知不觉中我们已经在使用-D的参数项,比如用下面参数来配置文件编码: -Dfile.encoding=UTF-8

再比如,用以下参数来配置dubbo的选项: java -Ddubbo.reference.com.foo.BarService.check=false java -Ddubbo.reference.check=false java -Ddubbo.consumer.check=false java -Ddubbo.registry.check=false

功能解析 -D=value 官网解释: Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes: 在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机上的应用程序可用: System.getProperty("属性名")

得到value的值。 如果value中有空格,则需要用双引号将该值括起来,如:-Dname=”kazaf f”。 该参数通常用于设置系统级全局变量值,如配置文件路径,保证该属性在程序中任何地方都可访问。 注意事项 (1)需要设置的是JVM参数而不是program参数; (2)使用此参数的参数优先级最高,会覆盖项目中配置的此项;

运行模式

编辑切换为居中

添加图片注释,不超过 140 字(可选)

jvm有两种运行模式

Client:

JDK1.7 之前在 32 位的 x86 机器上的默认值是 -client 选项。设置 jvm 使用 client 模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或者PC应用开发和调试。

Server:

设置 jvm 使 server 模式,特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境。在具有 64 位能力的 jdk 环境下将默认启用该模式,而忽略 -client 参数。

JVM的两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远远要快。

-Xint:

在解释模式(interpreted mode)下,-Xint 标记会强制 JVM 解释执行所有的字节码,这当然会降低运行速度,通常低 10 倍或更多。

-Xcomp:

-Xcomp 参数与 -Xint 正好相反,JVM 在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。

-Xmixed:

-Xmixed 是混合模式,将解释模式和变异模式进行混合使用,有 JVM 自己决定,这是 JVM 的默认模式,也是推荐模式。 我们使用java -version 可以看到 mixed mode 等信息。

堆内存

编辑切换为居中

添加图片注释,不超过 140 字(可选)

JVM 总内存=堆+栈+非堆+堆外内存

设置堆内存

JVM 的内存设置是最重要的参数设置,也是 GC 分析和调优的重点。JVM 总内存=堆+栈+非堆+堆外内存。

-Xmx:

指定最大堆内存。 如 -Xmx4g. 这只是限制了 Heap 部分的最大值为 4g。这个内存不包括栈内存,也不包括堆外使用的内存。

-Xms:

指定堆内存空间的初始大小。 如 -Xms4g。 而且指定的内存大小,并不是操作系统实际分配的初始值,而是 GC 先规划好,用到才分配。 专用服务器上需要保持 -Xms和-Xmx一致,否则应用刚启动可能就有好几个 FullGC。当两者配置不一致时,堆内存扩容可能会导致性能抖动。

-Xmn:

等价于 -XX:NewSize,使用 G1 垃圾收集器 不应该 设置该选项,在其他的某些业务场景下可以设置。官方建议设置为 -Xmx 的 1/2 ~ 1/4。

-XX:MaxPermSize=size:

这是 JDK1.7 之前使用的。Java8 默认允许的 Meta 空间无限大,此参数无效。

-XX:MaxMetaspaceSize=size:

Java8 默认不限制 Meta 空间, 一般不允许设置该选项。

XX:MaxDirectMemorySize=size:

系统可以使用的最大堆外内存,这个参数跟-Dsun.nio.MaxDirectMemorySize效果相同。

-Xss:

设置每个线程栈的字节数。 例如 -Xss1m 指定线程栈为 1MB,与-XX:ThreadStackSize=1m等价

注意:

堆外内存:也就是说不在堆上的内存,我们可以通过jconsole,jvisualvm 等工具查看。对于IBM JVM和Hotspot,都可以通过-XX:MaxDirectMemorySize来设置nio直接缓冲区的最大值。默认是64M。超过这个时,会按照32M自动增大。

系统有大量的地方使用堆外内存,远比我们常说的 xmx 和 xms 包括的范围要广。所以我们需要在设置内存的时候留有余地,一般来说配置系统或容器里可用内存的 70-80% 最好。

GC相关

编辑切换为居中

添加图片注释,不超过 140 字(可选)

-XX:+UseG1GC: 使用 G1 垃圾回收器

-XX:+UseConcMarkSweepGC: 使用 CMS 垃圾回收器

-XX: +UseSerialGC: 使用串行垃圾回收器

-XX: +UseParallelGC: 使用并行垃圾回收器

/ Java 11+

XX: +UnlockExperimentalVMOptions -XX:+UseZGO/ Java 12+

-XX: +UnlockExperimentalVMOptions -XX:+UseShenandoahGO

GC 日志相关的参数

在生产环境或性能压测环境里,我们用来分析和判断问题的重要数据来源之一就是 GC 日志,JVM 启动参数为我们提供了一些用于控制 GC 日志输出的选项。

-verbose:gc :

和其他 GC 参数组合使用, 在 GC 日志中输出详细的GC信息。 包括每次 GC 前后各个内存池的大小,堆内存的大小,提升到老年代的大小,以及消耗的时间。此参数支持在运行过程中动态开关。比如使用 jcmd, jinfo, 以及使用 JMX 技术的其他客户端。

-XX:+PrintGCDetails 和 -XX:+PrintGCTimeStamps:

打印 GC 细节与发生时间。

-Xloggc:file:

与-verbose:gc功能类似,只是将每次 GC 事件的相关情况记录到一个文件中,文件的位置最好在本地,以避免网络的潜在问题。若与 verbose:gc 命令同时出现在命令行中,则以 -Xloggc 为准。

分析诊断

编辑切换为居中

添加图片注释,不超过 140 字(可选)

指定垃圾收集器相关参数

垃圾回收器是 JVM 性能分析和调优的核心内容之一,也是近几个 JDK 版本大力发展和改进的地方。通过不同的 GC 算法和参数组合,配合其他调优手段,我们可以把系统精确校验到性能最佳状态。

以下参数指定具体的垃圾收集器。

-XX:+UseG1GC:使用 G1 垃圾回收器

-XX:+UseConcMarkSweepGC:使用 CMS 垃圾回收器

-XX:+UseSerialGC:使用串行垃圾回收器

-XX:+UseParallelGC:使用并行垃圾回收器

JavaAgent

编辑切换为居中

添加图片注释,不超过 140 字(可选)

Agent 是 JVM 中的一项黑科技,可以通过无侵入方式来做很多事情,比如注入AOP 代码,执行统计等等,权限非常大。这里简单介绍一下配置选项,详细功能需要专门来讲。

设置 agent 的语法如下:

-agentlib:libname[=options] 启用 native 方式的 agent,参考 LD_LIBRARY_PATH 路径

-age-ntpath:pathname[=options] 启用 native 方式的 agent。

-javaagent:jarpath[=options] 启用外部的 agent 库,比如 pinpoint.jar 等等

-Xnoagent 则是禁用所有 agent

以下示例开启 CPU 使用时间抽样分析:

JAVA _OPTS="-agentlib:hprof=cpu=samples,file=cpu.samples.log"

编辑切换为居中

添加图片注释,不超过 140 字(可选)

什么是Java agent

Java agent 是从 JDK1.5开始引入的技术,支持将 jar 依附在 JVM 进程中运行。

Java agent 分为静态加载和动态加载两种agent加载的方式,如下图:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

参考文档:https://blog.csdn.net/BASK2311/article/details/127491913

常见问题

1.既然jvm有的非标准参数是无法支持的,那么我们想使用的参数如何查询是否有效支持?

答案就是:java -x

2.以前工作时也碰到过课程视频中所说的,就是我们一个服务命名没有什么用户量,但是总是不断的oom。我们查看GC日志后没有明显的问题,这时候我就就需要看下启动参数了。

我们-xmx配置的最大内存数值一定不要超过本机服务器的80%,而xms也和xmx相同。

否则就没法给一些非堆内存和其他程序留出空间了。一般情况下直接配置60-80%即可,现在服务器一般都是1G起步。

3.Java中各大版本的默认垃圾回收器是什么?java8呢?这个我们会在后面的GC算法中讲到,又兴趣的可以自己先看看,到时候可以一起讨论。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • jvm启动参数
  • 系统属性
  • 运行模式
  • 堆内存
  • GC相关
  • 分析诊断
  • JavaAgent
  • 常见问题
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档