JVM系列(五) -内存相关的调优参数

一、摘要

在上篇文章中,我们详细介绍了 JVM 的内存布局。

今天这篇文章,并结合之前的介绍知识,一起了解一下 JVM 内存相关的调优参数。

二、内存设置相关的命令

所有内存溢出的问题,除了代码可能存在问题以外,更直观的问题是内存空间不足,如何通过参数来控制各区域的内存大小呢?

我们先来看一张图。

相关的常用控制参数介绍!

2.1、堆内存大小相关参数设置

1)-Xms

设置堆的最小空间大小,此值必须是 1024 的倍数且大于 1 MB。附加字母 k 或 k 表示千字节,m 或 m 表示兆字节,g 或 g 表示千兆字节,其它命令参数同理。比如-Xms1024m,表示堆的最小内存为1024M,默认值为物理内存的1/64

2)-Xmx

设置堆的最大空间大小,此值必须是 1024 的倍数且大于 2 MB。比如-Xmx2048m,表示堆最大内存为2G,默认值为物理内存的1/4

对于服务器部署,-Xms-Xmx通常建议设置为相同的值,以避免堆的内存空间频繁扩缩。

3)-XX:+HeapDumpOnOutOfMemoryError

表示可以让虚拟机在出现内存溢出异常时 Dump 出当前的堆内存转储快照

2.2、年轻代内存大小相关参数设置

1)-XX:NewSize

设置年轻代的最小空间大小,比如-XX:NewSize=256m,表示年轻代的最小内存为256M

GC 在这个区域比在其他区域执行的频率更高,如果年轻一代的设置太小,那么将进行大量的小频率 GCs。如果设置太大,那么会执行完整的GCs,这可能需要很长时间才能完成。Oracle 建议将年轻一代的大小保持在堆总大小的一半到四分之一之间。同时,该值需要小于-Xms的值。

2)-XX:MaxNewSize

设置年轻代的最大空间大小,比如-XX:MaxNewSize=512m,表示年轻代的最大内存为512M

3)-Xmn

设置年轻代堆的初始大小和最大大小,比如-Xmn128m,表示年轻代的初始大小和最大大小为128M

这个参数是对-XX:newSize-XX:MaxnewSize两个参数同时进行配置,虽然会很方便,但需要注意的是这个参数是在 JDK1.4 版本以后才加入的,低于此版本无法使用。

没有直接设置老年代的参数,但是可以设置堆空间大小和年轻代空间大小两个参数来间接控制,公式如下:

老年代空间大小 = 堆空间大小 - 年轻代空间大小
2.3、比例方式相关参数设置

1)-XX:NewRatio

设置年轻代和老年代大小之间的比例,默认值是-XX:NewRatio=2,表示Young : Old = 1 : 2

2)-XX:SurvivorRatio

设置 Eden 空间大小和 Survivor 空间大小之间的比例,默认值是-XX:SurvivorRatio=8,表示Eden : from : to = 8 : 1 : 1

3)-XX:MinHeapFreeRatio

设置 GC 事件后允许的最小可用堆空间百分比(0到100),如果可用堆空间低于此值,则堆将被扩展。默认情况下,此参数为-XX:MinHeapFreeRatio=40,表示40%

4)-XX:MaxHeapFreeRatio

设置 GC 事件后允许的最大可用堆空间百分比(0到100)。如果可用堆空间高于此值,则堆将被缩小。默认情况下,此参数为-XX:MaxHeapFreeRatio=70,表示70%

2.4、非堆区相关参数设置

1)-XX:PermSize

设置永久代的最小空间大小,比如-XX:PermSize=256m,表示永久代的最小内存为256M,默认值为物理内存的1/64

2)-XX:MaxPermSize

置永久代的最大空间大小,比如-XX:MaxPermSize=512m,表示永久代的最大内存为512M,默认值为物理内存的1/4

值得注意的是,-XX:PermSize-XX:MaxPermSize这两个参数,在 JDK1.7 及以前的版本中有效,在 JDK1.8 中已经被弃用,被-XX:MetaspaceSize-XX:MaxMetaspaceSize两个参数取代。

2.5、栈内存相关参数设置

1)-Xss

设置每个线程的栈大小,比如-Xss1024k,表示每个线程的堆栈空间大小为1024KB,通常不需要我们调整设置,默认值取决于平台:

  • Linux/ARM (32-bit):320 KB
  • Linux/i386 (32-bit):320 KB
  • Linux/x64 (64-bit):1024 KB
  • OS X (64-bit):1024 KB
  • Oracle Solaris/i386 (32-bit):320 KB
  • Oracle Solaris/x64 (64-bit):1024 KB

2)-Xoss

设置每个线程中的本地方法栈大小,比如-Xoss128k,表示每个线程中的本地方法栈大小为128KB,不过 HotSpot 并不区分虚拟机栈和本地方法栈,因此对于 HotSpot 来说这个参数是无效的。

2.6、堆外内存相关参数设置

1)-XX:MaxDirectMemorySize

此参数的含义是通过Direct ByteBuffer方式分配的最大堆外内存大小。比如-XX:MaxDirectMemorySize=60m,表示堆外最大内存不能超过60M,如果没有设置,默认是 0,JVM 会自动申请内存的大小,最大大小受限于-Xmx值。

三、内存溢出的几种场景

在上文中,我们介绍了 JVM 内存结构以及可能会发生的异常状况,下面我们一起来复现一下几种常见的内存溢出现象。

3.1、堆溢出

堆溢出测试类如下。

/*** 虚拟机参数: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError*/
public class HeapOOMTest {public static void main(String[] args) {List<HeapOOMTest> list = new ArrayList<>();while (true){list.add(new HeapOOMTest());}}
}

在 IDEA 中设置 JVM 相关的参数。

运行后输出结果如下:

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid21886.hprof ...
Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3210)at java.util.Arrays.copyOf(Arrays.java:3181)at java.util.ArrayList.grow(ArrayList.java:265)at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)at java.util.ArrayList

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

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

相关文章

不小心删除丢失了所有短信?如何在 iPhone 上查找和恢复误删除的短信

不小心删除了一条短信&#xff0c;或者丢失了所有短信&#xff1f;希望还未破灭&#xff0c;下面介绍如何在 iPhone 上查找和恢复已删除的短信。 短信通常都是非正式和无关紧要的&#xff0c;但短信中可能包含非常重要的信息。因此&#xff0c;如果您删除了一些短信以清理 iPh…

030集——自动弹出对话框、选择文件并播放wav音频文件(winform窗体)——C#学习笔记

如图所示&#xff0c;效果如下&#xff1a; 步骤如下&#xff1a; 新建一个winform窗体&#xff0c;双击界面&#xff0c;进入代码区&#xff1a; 复制&#xff08;下面代码中命名空间内的代码&#xff09;到&#xff08;你的命名空间下&#xff09;&#xff0c;运行。 using …

ZBrush入门使用介绍——12、折边

大家好&#xff0c;我是阿赵。   继续介绍ZBrush的功能。   如果拿一个立方体&#xff0c;进行CtrlD增加细分 会出现在边缘的线会被平滑的情况&#xff0c;这时候原来立方体的形状会发生一定的变化&#xff0c;不能保持原来的形状。 如果立方体真的只有8个顶点&#xff0…

266-基于Xilinx Kintex-7 XC7K325T 的12路光纤Switch交换平台

一、板卡概述 该系统是由两块模块组成&#xff0c;分别是基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片&#xff0c;pin_to_pin兼容FPGAXC7K410T-2FFG900 的模块和一个FPGA夹层卡&#xff08;FMC&#xff09;模块。前者支持64bit DDR3容量2GByte&#xff0c;USB3.0接口;HPC的FMC连…

C++: set与map容器的介绍与使用

本文索引 前言1. 二叉搜索树1.1 概念1.2 二叉搜索树操作1.2.1 查找与插入1.2.2 删除1.2.3 二叉搜索树实现代码 2. 树形结构的关联式容器2.1 set的介绍与使用2.1.1 set的构造函数2.1.2 set的迭代器2.1.3 set的容量2.1.4 set的修改操作 2.2 map的介绍与使用2.2.1 map的构造函数2.…

【尚跑】2024陕西淳化天然氧吧半程马拉松赛149顺利完赛

1、赛事背景 奔跑美丽淳化&#xff0c;畅游天然氧吧。9月8日上午&#xff0c;2024淳化天然氧吧半程马拉松赛在淳化县润镇东街鸣枪开跑&#xff0c;4000名马拉松爱好者相聚美丽淳化&#xff0c;赏荞麦花海、闻硕果飘香&#xff0c;共同开启这场挑战自我、超越极限的奔跑之旅 本次…

flask下https教程

一、定义 linux 下flask https 协议 二、实现 linux 下flask https 协议 生成SSL证书和密钥文件。您可以使用工具如openssl来生成自签名SSL证书和密钥文件。运行以下命令生成证书和密钥文件&#xff1a; openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout…

springboot 的共享session方案?

问&#xff1a;springboot 的共享session方案&#xff1f; 参考&#xff1a; https://juejin.cn/post/7195227930077691963分布式之session共享问题 4种解决方案及spring session的使用_分布式session共享方案-CSDN博客 什么是 Session &#xff1f; 答&#xff1a;因为Http协…

JavaScript web API part1

web API 前言 变量声明 const优先&#xff0c;可变再改为let 原因&#xff1a; 语义化更好若以后变量不改变&#xff0c;就应用const声明实际开发中&#xff0c;react框架中基本都是从const [!IMPORTANT] 基本变量中数据若改变&#xff0c;则不可用const 数组&#xff0c;对…

计算机毕业设计Python+Tensorflow股票推荐系统 股票预测系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《Tensorflow股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和金融市场的日益复杂化&#xff0c;股票作为金融市场的重要组成部分&#xff0c;其价格波动受到广泛关注。传统的股票预测方法如技术分析和基本面分析&#xff0c;虽然在一定程度上能够辅助投…

如何查询、统计品牌在社媒平台的品牌声量?

现在各平台的竞争越来越激烈&#xff0c;企业想做好在社媒平台上的品牌营销&#xff0c;就需要时刻监测品牌声量的大小&#xff0c;比如企业品牌声量趋势、品牌sov值、搜索指数等相关指标&#xff0c;辅助衡量品牌宣传效果如何。那怎么去查询统计品牌声量情况呢&#xff1f;可以…

获取多行文本内容,去掉首尾空格、去掉空字符串,解析为文本数组

核心代码 // 获取多行文本内容&#xff0c;去掉首尾空格、去掉空字符串&#xff0c;解析为文本数组 getMultiLineTexts(textareaValue) {return textareaValue.split("\n").map((v) > v.split("\t").join("").trim()).filter((v, i, ar) &g…

数据库的操作:SQL语言的介绍

一.前言 SQL是一种结构化查询语言。关系型数据库中进行操作的标准语言。 二.特点 ①对大小写不敏感 例如&#xff1a;select与Select是一样的 ②结尾要使用分号 没有分号认为还没结束; 三.分类 ①DDL&#xff1a;数据定义语言&#xff08;数据库对象的操作&#xff08;结…

uniapp设置微信小程序的交互反馈

链接&#xff1a;uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗&#xff1a; title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon&#xff1a;error是设置我们失败的logo 设置的文字上…

MyBatis ——在java层面对MySQL数据库进行操作

目录 MyBatis 是一款优秀的 持久层框架&#xff0c;用于简化JDBC&#xff08;java操作数据库&#xff09;的开发&#xff1b; 使用MyBatis 查询所有用户数据的过程 Lombok是一个实用的]ava类库&#xff0c;能通过注解的形式 简化 JavaBean的代码 注解&#xff1a; 引入Myb…

【Leetcode152】乘积最大子数组(动态规划)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 &#xff08;0&#xff09;读懂题意&#xff1a;题目的“连续”是指位置的连续&#xff0c;而不是说数字的连续&#xff0c;这是个大坑。 &#xff08;1&#xff09;确定状态&#xff1a;定义两个状态来记录当前子数组的…

Python 爬虫项目实战(一):爬取某云热歌榜歌曲

前言 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;也称为网页蜘蛛&#xff08;Web Spider&#xff09;或网页机器人&#xff08;Web Bot&#xff09;&#xff0c;是一种按照既定规则自动浏览网络并提取信息的程序。爬虫的主要用途包括数据采集、网络索引、内容抓…

MySQL笔记2(DQL查询语言【条件、分组、排序、限制、子查询、左右连接、内连接、联合查询】)

DQL数据查询语言与项目高级查询实战 先安装数据库并创建一个库 并创建以下数据 /*创建部门表*/CREATE TABLE dept( deptnu INT PRIMARY KEY comment 部门编号, dname VARCHAR(50) comment 部门名称, addr VARCHAR(50) comment 部门地址 );/*某个公司的员工表*/ CREATE TABLE…

「ComfyUI」比 joy_caption 更好用的提示词反推模型!

前言 距离我们上次介绍 joy_caption 还没几天呢&#xff0c;这就又出新模型来与 joy_caption 一争高下了。 今天我们要介绍的是&#xff1a;Florence-2-X-PromptGen-v1.5&#xff0c;是在 Florence-2 的基础上进行精细调优的一款高级图像标注工具&#xff0c;专门为生成和标注…

Flutter框架——2.状态-路由-包-资源

文章参考了Flutter中国开源项目发起人杜文&#xff08;网名wendux&#xff09;创作的一本系统介绍Flutter技术的中文书籍《Flutter实战第二版》&#xff0c;网址&#xff1a;第二版序 | 《Flutter实战第二版》 https://book.flutterchina.club/#第二版变化 文章目录 一、状态管…