常用JVM配置参数简介

news2024/11/16 9:16:04

b9a56752f12a4b32b339441087725ad2.gif既然学习JVM,阅读GC日志是处理Java虚拟机内存问题的基础技能,它只是一些人为确定的规则,没有太多技术含量。

 

 

既然如此,那么在IDE的控制台打印GC日志是必不可少的了。现在就告诉你怎么打印。

 

(1)如果你用的是Eclipse,打印GC日志的操作如下:

 

d32742cf-b002-4c55-a185-d4ccdc90a69c

 

bc5b8afb-9d1f-438b-9225-ee7fbbbe2454

 

在上图的箭头处加上-XX:+PrintGCDetails这句话。于是,运行程序后,GC日志就可以打印出来了:

 

25d80649-69f0-47b2-a3bb-418ba4457849

 

(2)如果你用的是IntelliJ IDEA,打印GC日志的操作如下:

 

94726055-e81f-45b8-8978-d1277c5acb17

 

f2c896da-404c-4415-98ef-5b582dec3528

 

在上图的箭头处加上-XX:+PrintGCDetails这句话。于是,运行程序后,GC日志就可以打印出来了:

 

6b1b4352-7172-4404-ac6c-b94c16036d73

 

当然了,光有-XX:+PrintGCDetails这一句参数肯定是不够的,下面我们详细介绍一下更多的参数配置。

 

 

 

一、Trace跟踪参数:

 

1、打印GC的简要信息:

 

-verbose:gc

-XX:+printGC

解释:可以打印GC的简要信息。比如:

 

[GC 4790K->374K(15872K), 0.0001606 secs]

 

[GC 4790K->374K(15872K), 0.0001474 secs]

 

[GC 4790K->374K(15872K), 0.0001563 secs]

 

[GC 4790K->374K(15872K), 0.0001682 secs]

 

上方日志的意思是说,GC之前,用了4M左右的内存,GC之后,用了374K内存,一共回收了将近4M。内存大小一共是16M左右。

 

2、打印GC的详细信息:

 

-XX:+PrintGCDetails

解释:打印GC详细信息。

 

-XX:+PrintGCTimeStamps

解释:打印CG发生的时间戳。

 

理解GC日志的含义:

 

例如下面这段日志:

 

[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 

 

上方日志的意思是说:这是一个新生代的GC。方括号内部的“4416K->0K(4928K)”含义是:“GC前该内存区域已使用容量->GC后该内存区域已使用容量(该内存区域总容量)”。而在方括号之外的“4790K->374K(15872K)”表示“GC前Java堆已使用容量->GC后Java堆已使用容量(Java堆总容量)”。

 

再往后看,“0.0001897 secs”表示该内存区域GC所占用的时间,单位是秒。

 

再比如下面这段GC日志:

 

1fe41f36-cc6b-4a8b-b48e-8cbe2e3a04af

 

上图中,我们先看一下用红框标注的“[0x27e80000, 0x28d80000, 0x28d80000)”的含义,它表示新生代在内存当中的位置:第一个参数是申请到的起始位置,第二个参数是申请到的终点位置,第三个参数表示最多能申请到的位置。上图中的例子表示新生代申请到了15M的控件,而这个15M是等于:(eden space的12288K)+(from space的1536K)+(to space的1536K)。

 

疑问:分配到的新生代有15M,但是可用的只有13824K,为什么会有这个差异呢?等我们在后面的文章中学习到了GC算法之后就明白了。

 

 

 

3、指定GC log的位置:

 

-Xloggc:log/gc.log

解释:指定GC log的位置,以文件输出。帮助开发人员分析问题。

 

805e8e33-1e3b-46c0-af9d-d68f4d38816f

 

  

 

-XX:+PrintHeapAtGC

解释:每一次GC前和GC后,都打印堆信息。

 

例如:

 

1c6f3837-4b31-4ac2-a639-e79c92f80df5

 

上图中,红框部分正好是一次GC,红框部分的前面是GC之前的日志,红框部分的后面是GC之后的日志。

 

-XX:+TraceClassLoading

解释:监控类的加载。

 

例如:

 

[Loaded java.lang.Object from shared objects file]

 

[Loaded java.io.Serializable from shared objects file]

 

[Loaded java.lang.Comparable from shared objects file]

 

[Loaded java.lang.CharSequence from shared objects file]

 

[Loaded java.lang.String from shared objects file]

 

[Loaded java.lang.reflect.GenericDeclaration from shared objects file]

 

[Loaded java.lang.reflect.Type from shared objects file]

 

-XX:+PrintClassHistogram

解释:按下Ctrl+Break后,打印类的信息。

 

例如:

 

c8050739-0029-47cd-95bd-fbbd6289a5d1

 

 

 

二、堆的分配参数:

 

1、-Xmx –Xms:指定最大堆和最小堆

 

举例、当参数设置为如下时:

 

-Xmx20m -Xms5m

然后我们在程序中运行如下代码:

 

System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M"); //系统的最大空间

 

System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M"); //系统的空闲空间

 

System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M"); //当前可用的总空间

 运行效果:

 

79c1029d-58fe-47d9-aa2e-1c5ee7e741cd

 

保持参数不变,在程序中运行如下代码:(分配1M空间给数组)

 

复制代码

复制代码

byte[] b = new byte[1 * 1024 * 1024];

System.out.println("分配了1M空间给数组");

 

System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M"); //系统的最大空间

 

System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M"); //系统的空闲空间

 

System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");   

复制代码

复制代码

运行效果:

 

14d260c9-28bf-4544-a36f-ee14a1d59623

 

注:Java会尽可能将total mem的值维持在最小堆。

 

保持参数不变,在程序中运行如下代码:(分配10M空间给数组)

 

复制代码

复制代码

byte[] b = new byte[10 * 1024 * 1024];

System.out.println("分配了10M空间给数组");

 

System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M"); //系统的最大空间

 

System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M"); //系统的空闲空间

 

System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M"); //当前可用的总空间

复制代码

复制代码

运行效果:

 

284e8036-8d70-46bc-aac1-99c9b3deb3ef

 

如上图红框所示:此时,total mem 为7M时已经不能满足需求了,于是total mem涨成了16.5M。

 

 

 

保持参数不变,在程序中运行如下代码:(进行一次GC的回收)

 

复制代码

复制代码

System.gc();

 

System.out.println("Xmx=" + Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M"); //系统的最大空间

 

System.out.println("free mem=" + Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M"); //系统的空闲空间

 

System.out.println("total mem=" + Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M"); //当前可用的总空间 

复制代码

复制代码

运行效果:

 

e419c020-0da3-4046-9b7f-f542ee14a780

 

问题1: -Xmx(最大堆空间)和 –Xms(最小堆空间)应该保持一个什么关系,可以让系统的性能尽可能的好呢?

 

问题2:如果你要做一个Java的桌面产品,需要绑定JRE,但是JRE又很大,你如何做一下JRE的瘦身呢?

 

 

 

2、-Xmn、-XX:NewRatio、-XX:SurvivorRatio:

 

-Xmn

    设置新生代大小

 

-XX:NewRatio

    新生代(eden+2*s)和老年代(不包含永久区)的比值

 

        例如:4,表示新生代:老年代=1:4,即新生代占整个堆的1/5

 

-XX:SurvivorRatio(幸存代)

    设置两个Survivor区和eden的比值

 

        例如:8,表示两个Survivor:eden=2:8,即一个Survivor占年轻代的1/10

 

 

 

现在运行如下这段代码:

 

复制代码

复制代码

public class JavaTest {

    public static void main(String[] args) {

        byte[] b = null;

        for (int i = 0; i < 10; i++)

            b = new byte[1 * 1024 * 1024];

    }

}

复制代码

复制代码

我们通过设置不同的jvm参数,来看一下GC日志的区别。

 

 

 

(1)当参数设置为如下时:(设置新生代为1M,很小)

 

-Xmx20m -Xms20m -Xmn1

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

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

相关文章

Elasticsearch7.8.0版本高级查询—— 分页查询文档

目录一、初始化文档数据二、分页查询文档2.1、概述2.2、示例一、初始化文档数据 在 Postman 中&#xff0c;向 ES 服务器发 POST 请求 &#xff1a;http://localhost:9200/user/_doc/1&#xff0c;请求体内容为&#xff1a; { "name":"zhangsan", "ag…

数据分析-深度学习 Pytorch Day8

一。什么是循环神经网络&#xff1a;循环神经网络&#xff08;Rerrent Neural Network, RNN&#xff09;&#xff0c;历史啊&#xff0c;谁发明的都不重要&#xff0c;说了你也记不住&#xff0c;你只要记住RNN是神经网络的一种&#xff0c;类似的还有深度神经网络DNN&#xff…

广州周立功CanTest卡使用教程一

网上有不少Can采集平台,包括Ardunio,Can卡,也有不少人用Freescale自己DIY一个平台,这些都是相当不错,并且都有成熟的代码,这里介绍在汽车诊断软件领域普遍都会选择的Can卡使用。 大家是不是对这个节面非常熟悉,CAN-bus 通用测试软件是一个专门用来对所有的 ZLGCAN 系列板…

【Python】基于经典网络架构训练图像分类模型——图像识别模型与训练策略(2023年1月22日,大年初一,春节快乐,兔年大吉)

声明:仅学习使用~ 今天是大年初一,祝大家新年快乐!!! 这个练习使用的图片稍多,因此初次在PyCharm里面可能会需要一些时间。 (注释中包含遇到的一些错误以及修正,同时也含有一些输出,部分较长的输出以省略号的形式在注释里面展示了) 2023.1.22,大年初一,新年快乐…

LoadBalancer源码解析

文章目录一、背景二、总体流程三、源码解析1. lb拦截器配置2. LB拦截器实现3. LB执行前置处理4. 负载均衡5. LB执行http请求一、背景 Spring Cloud 2020版本以后&#xff0c;默认移除了对Netflix的依赖&#xff0c;其中就包括Ribbon&#xff0c;官方默认推荐使用Spring Cloud …

生物化学 电阻抗成像OpenEIT 番外篇 EIT公式

EIT简介 摘要电阻抗断层扫描&#xff08;EIT&#xff09;是一种成像方式&#xff0c;使用无害的电流探测患者或物体。电流通过放置在靶表面上的电极馈送&#xff0c;数据由在电极处测量的电压组成&#xff0c;这些电压由一组线性独立的电流注入模式产生。EIT旨在恢复目标内部电…

【MySQL】第八部分 加密和解密函数

【MySQL】第八部分 加密和解密函数 文章目录【MySQL】第八部分 加密和解密函数8. 加密和解密函数总结8. 加密和解密函数 函数用法PASSWORD(str)返回字符串str的加密版本&#xff0c;41位长的字符串。加密结果不可逆&#xff0c;常用于用户的密码加密.( 8.0 版本以上不能用)MD5…

海湾化学冲刺上交所上市:计划募资30亿元,华融曾是其股东

近日&#xff0c;青岛海湾化学股份有限公司&#xff08;下称“海湾化学”&#xff09;预披露招股书&#xff0c;准备在上海证券交易所主板上市。本次冲刺上市&#xff0c;海湾化学计划募资30亿元&#xff0c;将于37.5万吨/年环氧氯丙烷绿色循环经济项目&#xff08;一期&#x…

23种设计模式(十七)——状态模式【状态变化】

状态模式 文章目录 状态模式意图什么时候使用状态真实世界类比状态模式的实现状态模式的优缺点亦称:State 意图 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式的解决思想是:当控制一个对象状态转…

【沐风老师】教你用3dMax柱子插件Pillars打造欧式罗马柱建模(附柱子插件下载)

Pillars是一个很棒的3dMax插件。Pillars可以创建柱子、柱状物、栏杆、喷泉&#xff08;喷泉建筑的造型&#xff09;和各种类似形状的三维模型。它也会破坏&#xff08;打断&#xff09;这些模型。有了它&#xff0c;您只需在几秒钟内就能制作出外观精美的柱子和效果逼真的断面效…

4、JDK相关设置

文章目录4、JDK相关设置4.1 设置项目的JDK4.2 设置编译版本4.3 设置out目录【尚硅谷】idea实战教程-讲师&#xff1a;宋红康 生活是属于每个人自己的感受&#xff0c;不属于任何别人的看法 4、JDK相关设置 4.1 设置项目的JDK SDK&#xff1a;软件开发工具包 JDK&#xff1a;Ja…

灭火器摆放识别检测算法 yolo

灭火器摆放识别检测算法通过pythonyolo网络深度学习技术&#xff0c;自动对指定区域灭火器是否缺失进行识别&#xff0c;如果 没有检测到指定区域有灭火器&#xff0c;立即抓拍存档进行告警。YOLO系列算法是一类典型的one-stage目标检测算法&#xff0c;其利用anchor box将分类…

Elasticsearch基本使用初体验02

1.Java API操作ES 1.1 创建项目 创建spring Boot工程&#xff0c;添加相关的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><…

基于ssm校园学生协会管理系统jsp校园社团管理系统源码和论文

1、开发环境 &#xff08;1&#xff09;操作系统: Windows10 &#xff08;2&#xff09;数据库与数据库管理工具: MySQL 5.7.19、Navicat for MySQL &#xff08;3&#xff09;Web服务器: Tomcat8.5.38 &#xff08;4&#xff09;开发工具与技术: Eclipse IDEA、SSM框架、Ajax …

2023寒假算法集训营3

&#xff08;数学场真折磨人&#xff09; A. 不断减损的时间&#xff08;贪心&#xff09; 题意&#xff1a; 给定一个数组&#xff0c;任意次操作&#xff0c;每次操作可以 选择一个偶数除以 222 。 求最终数组所有元素之和的最小值。 思路&#xff1a; 要使得所有元素之…

三十四、Kubernetes1.25中Ingress介绍、安装

1、介绍 在前面文章中已经提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff1a;NotePort和LoadBalancer&#xff0c;但是这两种方式&#xff0c;都有一定的缺点&#xff1a; NodePort方式的缺点是会占用很多集群机器的端口&#xff0c;那么当集群服务变多的…

【JavaSE专栏2】JDK、JRE和JVM

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

Nacos-统一配置中心

Nacos-统一配置中心统一配置管理1.Nacos编写配置文件2.微服务拉取配置&#xff08;1&#xff09;引入pom依赖&#xff08;2&#xff09;添加bootstrap.yaml&#xff08;3&#xff09;读取nacos配置3.配置热更新&#xff08;1&#xff09;方式一&#xff08;2&#xff09;方式二…

Ubuntu显示优化 动画

之前从win转到了ubuntu。老大哥问我为啥不直接用Mac。我笑笑没说话。其实就一个字&#xff0c;穷。 使用Ubuntu的过程中有一点小问题&#xff0c;不过平时我主要用来编程&#xff0c;对壁纸&#xff0c;过渡动画这些东西其实并不是很在乎。直到我审美感爆棚的妻子告诉我&#…

设计模式学习(十一):Builder建造者模式

一、什么是Builder模式大都市中林立着许多高楼大厦&#xff0c;这些高楼大厦都是具有建筑结构的大型建筑。通常&#xff0c;建造和构建这种具有建筑结构的大型物体在英文中称为Build。在建造大楼时&#xff0c;需要先打牢地基&#xff0c;搭建框架&#xff0c;然后自下而上地一…