进阶2:JVM 启动参数

news2024/9/21 0:38:19

目录

jvm启动参数

参数分类

系统属性

功能解析

运行模式

jvm有两种运行模式

堆内存

设置堆内存

GC相关

GC 日志相关的参数

分析诊断

指定垃圾收集器相关参数

JavaAgent

什么是Java agent

常见问题

视频


前言

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

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使用

参数分类

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来设置。

系统属性

其他语言不清楚,但是作为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)使用此参数的参数优先级最高,会覆盖项目中配置的此项;

运行模式

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 等信息。

堆内存

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 包括的范围要广。所以我们需要在设置内存的时候留有余地,一般来说配置系统或容器里可用内存的 60-80% 最好。

GC相关

​-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 为准。

分析诊断

指定垃圾收集器相关参数

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

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

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

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

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

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

JavaAgent

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"

什么是Java agent

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

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

参考文档: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算法中讲到,又兴趣的可以自己先看看,到时候可以一起讨论。

视频

链接:https://www.aliyundrive.com/s/bfS1cHS9z8z

今天就到这里吧,感觉有用的小伙伴可以点个赞,你的支持就是我更新的最大动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue中Object.defineProperty

放到Object.defineProperty中比直接写在person对象中更灵活&#xff0c;可以设置的属性更多 <script>let person{name:张三,age:男}Object.defineProperty(person,age,{value:18,enumerable:true, //控制属性是否可以被枚举&#xff0c;默认值是falsewritable:true, //控…

无人机动力测试台-15公斤级-Flight Stand 15

Flight Stand 15测试台通过测量电机和螺旋桨的拉力、扭矩、转速、电流、电压、温度、螺旋桨效率和电机效率来精准地描述和评估无人机动力系统的性能。 产品应用 Flight Stand 15测试台可以用于以下方向&#xff1a; 实时动态测试 FS15 Pro的1000 Hz采样率使测试成为可能&…

Chrome 插件开发覆写xhr请求

这几天搞chrome谷歌浏览器插件遇到个问题 我想拦截网页请求&#xff0c;并把数据传递到下一个子窗口。获取responsebody内容 background.js 单纯靠sendmessage实现不了通讯 chrome.runtime.sendMessage({data: e.data.responseText,type:ajaxResponse}); 最开始的时候想用chr…

基于matlab使用自动要素匹配查找图像旋转和缩放(附源码)

一、前言 此示例演示如何自动确定一对图像之间的几何变换。当一个图像因旋转和缩放而相对于另一个图像失真时&#xff0c;请使用 和 查找旋转角度和比例因子。然后&#xff0c;您可以转换扭曲的图像以恢复原始图像。 二、步骤 1&#xff1a;读取图像 将映像引入工作区。 三、…

Bean的基础配置

问题1&#xff1a;在<bean>标签上如何配置别名&#xff1f; 问题2&#xff1a;Bean的默认作用范围是什么&#xff1f;如何修改&#xff1f; 1. Bean基础配置【重点】 类型描述名称bean类型标签所属beans标签功能定义Spring核心容器管理的对象格式 <beans> …

xcall脚本和xsync脚本 linux

一、xcall脚本 在cd /usr/local/bin/路径下创建xcall vim /usr/local/bin/xcall #!/bin/bash for host in hadoop100 hadoop101 hadoop102 doecho $host ssh $host jps done …

网络攻击与防御措施及防御产品

网络攻击与防御措施及产品 思维导图模板_ProcessOn思维导图、流程图分析了攻击类型、并列出了对不同的攻击方法的防御措施&#xff0c;和可以使用的安全设备。https://www.processon.com/view/649ba05dabde99162f8aecba

Java字节码分析快速入门/字节码执行分析(一)

目录 什么是字节码&#xff1f; 为什么要了解字节码&#xff1f; 如何查看字节码&#xff1f; 字节码包括哪些内容&#xff1f; 总结 hello读者盆友们&#xff0c;在上一篇文章[Java基础]面向对象-内存解析_小王师傅66的博客-CSDN博客最后&#xff0c;我们通过查看字节码&…

2022版本的unity里面的snap setting在哪

1.2022版本的unity 在scene 里面图中画圈的位置。 2.点击后效果如图。

数据库实验—存储过程

创建下列存储过程&#xff1a; 查询某位学生指定课程的成绩和学分&#xff08;修正&#xff1a;若该学生的课程成绩小于60分&#xff0c;则学分要显示为0分&#xff09; 提示&#xff1a;使用CASE…WHEN 例如&#xff1a;分别查询’张建国’和’李平方’选修的’数据库系统原理…

chatgpt赋能python:Python退出venv指南:安全退出虚拟环境

Python退出venv指南&#xff1a;安全退出虚拟环境 作为一名有10年Python编程经验的工程师&#xff0c;我很清楚地明白通过venv管理Python虚拟环境的好处。虚拟环境为每个项目提供了一个独立的Python运行时环境&#xff0c;这可以避免项目之间的依赖冲突&#xff0c;并且可以轻…

canvas图形等距、间距测量

首先定义画线&#xff08;实线、虚线&#xff09;、画面&#xff08;矩形块&#xff09;、值&#xff08;距离&#xff09;等渲染数据结构&#xff08;渲染数据只提供坐标信息和一些基本样式属性&#xff0c;不需要依赖渲染是dom&#xff0c;还是canvas或webgl&#xff09;侦测…

C语言:调整数组使奇数全部都位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c; 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分&#xff0c; 所有偶数位于数组的后半部分。 &#xff08;奇数在数组前面&#xff0c;偶数在数组后面&#xff09; 思路&#xff1a;…

【shell】expect命令详解:用expect实现自动化交互式操作

文章目录 一. 运用场景二. 语法说明三. 例子1. scp文件传输自动化2. ssh远程登录3. 切到root用户4. 创建ssh key5. ssh到一个节点创建用户 一. 运用场景 expect主要应用于自动化交互式操作的场景&#xff0c;借助Expect处理交互的命令&#xff0c;可以将交互过程如&#xff1a…

FPGA的软核、硬核、固核

“核” 现在的FPGA设计&#xff0c;规模巨大而且功能复杂&#xff0c;因此设计的每一个部分都从头开始是不切实际的。一种解决的办法是&#xff1a;对于较为通用的部分可以重用现有的功能模块&#xff0c;而把主要的时间和资源用在设计中的那些全新的、独特的部分。这就像是你在…

Golang:cannot find main module; see ‘go help modules‘解决

出现这个的原因就是之前在Golang语言介绍、环境搭建以及编译工具&#xff08; CDN 加速代理&#xff09;https://mp.csdn.net/mp_blog/creation/editor/131431492 这个部分配置CDN加速代理的时候&#xff0c;开启了GO111MODULEon后&#xff1b; go会忽略GOPATH和vendor文件夹&…

问题杂谈(三十五)Linux中文乱码问题

前言&#xff1a; 如下&#xff0c;系统的中文描述是乱码 步骤&#xff1a; 输入locale&#xff0c;如有zh cn 表示已经安装了中文语言 如果没有&#xff0c;通过yum groupinstall chinese-support下载 临时更换语言&#xff1a;输入LANG"en_US.UTF-8"系统设置&a…

【python docker error】最近出现docker拉取python官方镜像出现运行程序容器无法跑起来的现象

最近出现docker拉取python官方镜像出现运行程序容器无法跑起来的现象 官方在最近也就是2023年6月初将docker的python镜像由debian的buster版本切换到bookworm版本&#xff0c;导致一众的用户发现使用官方python的基础镜像的容器启动报错&#xff0c;我也是受害者之一。解决办法…

机器视觉初步10:目标跟踪

目标跟踪是计算机视觉中的一个重要领域&#xff0c;主要目的是在视频序列中跟踪一个或多个目标对象。常见的目标跟踪方法分为三类&#xff1a;非机器学习方法、机器学习方法和深度学习方法1。 文章目录 1.非机器学习方法a) 光流法&#xff08;Optical Flow&#xff09;b) Haar…

【瑞萨RA_FSP】RTC——实时时钟

文章目录 一、RTC简介1. RTC 特性 二、RTC的结构框图1. RTC引脚2. 时钟分频3. 日历计数器/二进制计数器4. 闹钟功能 三、实验&#xff1a;用RTC提供日历时间1. 硬件设计2. 文件结构3. FSP配置4. 宏定义5. 初始化RTC6. RTC中断回调函数7. hal_entry函数 一、RTC简介 RA6M5 的RT…