JVM常见启动参数

目录

内存参数设置

垃圾收集

内存溢出

其他杂项

总结


java虚拟机(JVM)的启动参数可以用来调整其行为、性能和资源分配。以下是一些常见的JVM启动参数:

内存参数设置

初始化堆内存以满足应用程序需求是最常见的与性能相关的实践之一。

这就是为什么我们应该指定最小和最大堆大小。我们可以使用以下参数来实现这一点:

-Xms<heap size>[unit] 
-Xmx<heap size>[unit]

在这里,单位表示我们将初始化内存的单位(由堆大小表示)。我们可以将单位标记为‘g’表示GB,‘m’表示MB,‘k’表示KB。

例如,如果我们想要分配最小的2GB和最大的5GB给JVM,我们需要写:

-Xms2G -Xmx5G

从Java 8开始,元数据空间(Metaspace)的大小不再固定。一旦达到全局限制,JVM会自动增加其大小。然而,为了克服任何不必要的不稳定性,我们可以使用以下方式设置Metaspace大小:

-XX:MaxMetaspaceSize=<metaspace size>[unit]

在这里,元空间大小表示我们想要分配给元空间的内存量。

根据Oracle的指南,除了总可用内存之外,第二个最具影响力的因素是为年轻代保留的堆的比例。默认情况下,YG的最小大小为1310 MB,最大大小为无限制。

我们可以显式地为它们分配:

-XX:NewSize=<young size>[unit] 
-XX:MaxNewSize=<young size>[unit]

垃圾收集

为了提高应用程序的稳定性,选择正确的垃圾收集算法至关重要。

JVM有四种类型的GC实现:

串行垃圾收集器(Serial Garbage Collector)

并行垃圾收集器(Parallel Garbage Collector)

CMS垃圾收集器(CMS Garbage Collector)

G1垃圾收集器(G1 Garbage Collector)

我们可以使用以下参数声明这些实现:

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

GC日志 

为了严密监控应用程序的健康状况,我们应该始终检查JVM的垃圾收集性能。最简单的方法是以人类可读的格式记录GC活动。

使用以下参数,我们可以记录GC活动:

-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=< number of log files > 
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

UseGCLogFileRotation参数指定日志文件的滚动策略,类似于log4j、s4lj等。NumberOfGCLogFiles参数表示单个应用程序生命周期内可以写入的最大日志文件数。GCLogFileSize参数指定文件的最大大小。最后,loggc指定了日志文件的位置。

在这里要注意的一点是,还有两个JVM参数可用(-XX:+PrintGCTimeStamps和-XX:+PrintGCDateStamps),我们可以使用它们在GC日志中打印日期时间戳。

例如,如果我们想要分配最多100个GC日志文件,每个文件最大大小为50 MB,并且我们想要将它们存储在'/home/user/log/'位置,我们可以使用以下语法:

-XX:+UseGCLogFileRotation  
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M 
-Xloggc:/home/user/log/gc.log

然而,问题在于始终会使用一个额外的守护线程在后台监视系统时间。这种行为可能会产生一些性能瓶颈,因此最好不要在生产环境中使用这个参数。

内存溢出

对于大型应用程序来说,面临内存溢出错误并导致应用程序崩溃是非常常见的。这是一个非常关键的场景,也很难复制以排查问题。

这就是为什么JVM提供了一些参数将堆内存转储到一个物理文件中,以便我们稍后使用它来查找内存泄漏的原因:

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=./java_pid<pid>.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >" 
-XX:+UseGCOverheadLimit

一些需要注意的要点:

  • HeapDumpOnOutOfMemoryError指示JVM在发生OutOfMemoryError时将堆转储到物理文件中。
  • HeapDumpPath表示文件将被写入的路径。可以给出任何文件名;但是,如果在名称中找到<pid>标记,当前进程导致内存不足错误的进程ID将附加到文件名中,并使用.hprof格式。
  • OnOutOfMemoryError用于在发生内存不足错误时执行紧急命令。我们应该在cmd args的空间中使用适当的命令。例如,如果我们希望在发生内存不足时立即重启服务器,可以设置参数:
-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit是一个策略,它限制了在抛出OutOfMemory错误之前VM在GC中花费的时间的比例。

32/64 Bit 

        在安装了32位和64位软件包的操作系统环境中,JVM会自动选择32位的环境软件包。

如果我们想要手动将环境设置为64位,可以使用以下参数:

-d<OS位数>

其中,OS位数可以是32或64。我们可以在这里找到更多关于此的信息。

其他杂项

  • -server:启用“Server Hotspot VM”。在64位JVM中,我们默认使用此参数。
  • -XX:+UseStringDeduplication:Java 8u20引入了这个JVM参数,用于通过创建太多相同字符串的实例来减少内存的不必要使用。这通过将重复的字符串值减少到一个全局char[]数组来优化堆内存。
  • -XX:+UseLWPSynchronization:设置基于LWP(轻量级进程)的同步策略,而不是基于线程的同步。
  • -XX:LargePageSizeInBytes:设置用于Java堆的大页大小。它以GB/MB/KB为参数。使用较大的页面大小,我们可以更好地利用虚拟内存硬件资源;但是,这可能会导致PermGen的空间大小更大,从而迫使我们减小Java堆空间的大小。
  • -XX:MaxHeapFreeRatio:设置GC后堆空闲的最大百分比,以避免收缩。
  • -XX:MinHeapFreeRatio:设置GC后堆空闲的最小百分比,以避免扩展。为了监视堆使用情况,我们可以使用JDK附带的VisualVM。
  • -XX:SurvivorRatio:Eden区/幸存者空间大小的比率。例如,-XX:SurvivorRatio=6将每个幸存者空间和Eden空间之间的比率设置为1:6。
  • -XX:+UseLargePages:如果系统支持,则使用大页内存。请注意,OpenJDK 7在使用此JVM参数时可能会崩溃。
  • -XX:+UseStringCache:启用String池中常用字符串的缓存。
  • -XX:+UseCompressedStrings:对可以表示为纯ASCII格式的String对象使用byte[]类型。
  • -XX:+OptimizeStringConcat:在可能的情况下优化字符串连接操作。

总结

        在本文中,我们学习了一些重要的JVM参数,这些参数可以用来调整和改善一般应用程序的性能。我们也可以将其中一些用于调试目的。

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

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

相关文章

Linux实战笔记(三) 文件压缩

大家好&#xff0c;我是半虹&#xff0c;这篇文章来讲 Linux 系统中常用的文件压缩方式 0、序言 在 Linux 系统中&#xff0c;存在许多打包或压缩文件的工具 这篇文章会对一些常用的工具进行分类整理和介绍 如果只是需要知道怎么对不同格式的文件做解压缩&#xff0c;可以直…

Linux中的流刷新和定位

一、流的刷新 int fflush(FILE *fp); 1.成功时返回0&#xff1b;出错时返回EOF 2.将流缓冲区中的数据写入实际的文件 3.Linux下只能刷新输出缓冲区,输入缓冲区丢弃 4.如果输出到屏幕使用fflush(stdout) 二、流的定位 long ftell(FILE *stream);long fseek(FILE *stre…

《底层逻辑》--透过表象看系统

上一个视频&#xff0c;讲了微软公司通过改变与供应商的“连接关系”从而提高了工作餐的质量&#xff1b; 今天就讲讲拥有这种洞察力背后的理论依据&#xff0c;即“透过表象看系统”&#xff1b; 系统 要素 连接关系&#xff1b;再细化一下&#xff0c;构成…

如何在MATLAB中处理图像和视频?

在MATLAB中处理图像和视频是一项复杂而强大的任务&#xff0c;涉及多个步骤和工具。MATLAB提供了丰富的函数和工具箱&#xff0c;使用户能够轻松地加载、处理、分析和显示图像和视频数据。 一、图像处理基础 加载图像&#xff1a;在MATLAB中&#xff0c;可以使用imread函数加…

2024蓝桥杯每日一题(并查集)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;奶酪 试题二&#xff1a;合并集合 试题三&#xff1a;连通块中点的数量 试题四&#xff1a;网络分析 试题一&#xff1a;奶酪 【题目描述】 现有一块大奶酪&#xff0c;它的高度为 hℎ…

shell source脚本中如何读取另外一个脚本中的变量

目录 前言语法举例注意 前言 要在一个Shell脚本中读取另一个Shell脚本中的变量&#xff0c;可以使用source命令或者.命令。这些命令用于在当前Shell环境中运行指定的脚本&#xff0c;从而使得脚本中的变量在当前Shell中可用。 语法 #!/bin/bash # 读取另一个Shell脚本中的变…

金智维的务实主义,打响大模型落地“突围战”

今年以来&#xff0c;新质生产力成为全社会关注的焦点。新质生产力的特征之一&#xff0c;就是深化新技术应用&#xff0c;尤其是AI及大模型&#xff0c;要加速落地到实际业务场景中&#xff0c;为千行万业提质增效。 2024是大模型技术做深、价值做实的一年。3月20日&#xff0…

【C++】详解智能指针

目录 一、智能指针的作用二、内存泄露1、什么是内存泄露2、内存泄漏分类3、如何避免内存泄露 三、智能指针的使用及原理1、RAII2、智能指针的原理3、std::auto_ptr4、std::unique_ptr5、std::shared_ptr1、std::shared_ptr原理2、std::shared_ptr的线程安全问题4、std::shared_…

python爬虫学习第二天----类型转换

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

安卓面试题多线程 101-105

101. 简述Java体系中锁的优化机制 ?从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。 锁的状态从低到高依次为无锁->偏向锁->轻量级锁->重量级…

20240321金融读报:金融活水促经济发展

虽然有点长&#xff0c;但是感觉很对诶&#xff0c;金融活水不就是跟着国家划得沟沟壑壑灌溉企业吗 银行信贷投放的宗旨是服务实体经济。我们要求全行牢牢把握高质量发展这个首要任务&#xff0c;融入国家新发展格局&#xff0c;锚定符合现代化产业体系、服务社会民生的方向来推…

QT常见数据类型和类的使用

QByteArray QByteArray 是一个Qt框架中的类&#xff0c;它是一个可变长的字节数组&#xff0c;可以用于存储任意类型的数据&#xff0c;包括二进制数据和文本数据 // 创建数组 QByteArray byteArray; // 空的字节数组 QByteArray byteArray1("Hello world"); // 初始…

电脑如何录视频?进阶教程来了!

随着科技的飞速发展&#xff0c;视频录制已成为我们日常生活和工作中不可或缺的一部分。无论是进行在线教育、制作教学视频&#xff0c;还是记录游戏过程、直播分享&#xff0c;录屏都扮演着至关重要的角色。可是您知道电脑如何录视频吗&#xff1f;本文将介绍两种电脑录视频的…

php做桌面应用,具体有哪些,但是集成图形库gui就差了点。主流的gui框架有哪些,php作为服务器端语言,处理网页没有问题

php做桌面应用&#xff0c;具体有哪些&#xff0c;但是集成图形库gui&#xff0c;比起python就差了点。主流的gui框架有哪些&#xff0c; 导读&#xff1a;现在流行全栈开发&#xff0c;一种语言满足web应用&#xff0c;桌面应用&#xff0c;手机应用&#xff0c;但是Php桌面应…

java 判断一个整数是否是回文数

java 判断一个整数是否是回文数 要判断一个整数是否是回文数&#xff0c;可以将其转换为字符串&#xff0c;然后比较字符串的正序和倒序是否相同。以下是用 Java 编写的判断回文数的函数&#xff1a; public class Palindrome {public static boolean isPalindrome(int x) {//…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型&#xff1a;链表、二叉树的遍历 链接&#xff1a;104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

vue2从基础到高级学习笔记

在实际的工作中,我常使用vue的用法去实现效果,但是你要是问我为什么这样写,它的原理是啥就答不上来了。对vue的认知一直停留在表面,写这篇文章主要是为了理清并弄透彻vue的原理。 学习目标 1 学会一些基本用法的原理 2 弄懂vue核心设计原理 3 掌握vue高级api的用法 一 vue…

sonarqube使用指北(一)- 基于docker的安装部署

一、前言 最近出于SDL的安全需求,打算部署一个静态代码扫描工具,出于通用性和可靠性的考虑,选择sonarqube来执行静态代码扫描。 SonarQube 是一个用于进行代码质量管理的开源平台,它提供了代码静态分析、代码检查、代码覆盖率等功能。下面是 SonarQube 的一些优缺点: 优点…

环境安装篇 之 安装kubevela

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 环境安装 系列文章&#xff0c;介绍 oam规范标准实施项目 kubevela 的安装详细步骤kubevela 官方安装文档&#xff1a;https://kubevela.io/zh/docs/installation/kubernetes/ 1.CentOS 安装kubevela 1.1.前提…

电脑数据安全新篇章:备份文件,守护您的珍贵数据

备份文件&#xff0c;无疑是电脑使用中不可或缺的重要一环。在数字化时代&#xff0c;我们的工作、学习和生活都离不开电脑&#xff0c;而电脑中的数据更是我们宝贵的财富。一旦数据丢失或损坏&#xff0c;可能会带来无法估量的损失。因此&#xff0c;备份文件的重要性不言而喻…