JVM调优:参数(学习笔记)

news2024/9/17 8:50:26

一、jvm的运行参数

    1. 标准参数
      1. -help、-version、-D参数

jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help 检索出所有的标准参数。 通过以下命令查看:

命令:java -help

可以看到我们经常会用到的 -sever,-version等参数。

实战1:查看JVM版本

命令:java -version

jvm版本是1.8.0_202,而且是64位,server,混合模式。

实战2:通过-D设置系统属性参数

先写一段代码:

public class TestVM {

        public static void main(String[] args) {

                String name = System.getProperty("name");

                if(name!=null){

                        System.out.println(name);

                }

                else{

                        System.out.println("ling");

                }

        }

}

运行上面这段代码,通过-D带入一个参数name,根据name的值进行判断如果name不为null,则打印,如果为null则打印 ling。

# 在root下创建一个文件夹下创建这个文件

vi TestJVM.java#把上面的java代码复制进去#执行代码

[root@localhost test]# javac TestJVM.java

[root@localhost test]# java TestJVM

ling#设置参数进行,设置系统属性:‐D<名称>=<值>

[root@localhost test]# java -Dname=smart哥

smart哥

      1. -server、-client参数

    1. -X参数(非标准参数)

jvm的-X参数是非标准参数,在不同版本的jvm中,参数可能会有所不同,可以通过java -X查看非标准参数。

    1. -XX参数(使用率较高)

    1. -Xms与-Xmx参数

    1. 查看jvm的运行参数

jinfo是JDK自带的一种命令行工具,用于查看和修改Java应用程序的运行参数。它可以帮助开发人员在运行时调整JVM参数,例如堆大小、GC收集器、线程栈大小等

查Java进程25834的JVM参数

命令:jinfo -flags 25834

Non-default VM flags:非标准参数

Command line: 通过命令行设置的参数

查Java进程25834的单个JVM参数

命令:jinfo -flag ConcGCThreads 25834

    1. jvm内存模型详解

jvm的内存模型在1.7和1.8有较大的区别,虽然本套课程是以1.8为例进行讲解,但是我们也是需要对1.7的内存模型有所了解,所以接下里,我们将先学习1.7再学习1.8的内存模型。目前线上常用版本组合是jdk8+tomcat8.5。

      1. jdk1.7的堆内存模型

fullGC - 回收整个堆内存(年轻代、老年代)

      1. jdk1.8的堆内存模型

JVM1.7和1.8的最大差异,1.7的永久区在堆内存(虚拟机)中,1.8永久区被废弃,加入了MetaData(位于机器直接内存(内存条)中,不在虚拟机中)

      1. 为什么要废弃1.7中的永久区?

可能理由,永久区管理字节码文件,一般情况下,增加字节码文件,都会重启虚拟机,运行中垃圾回收期基本不用管理字节码文件,只有热部署的时候,永久区才会断追加字节码文件,这也就是为什么热部署容易报java.lang.OutOfMemoryError:PermGen space,也可能是导致永久区不再需要被虚拟机管理,在1.8被移除的一个重要原因,将字节码文件直接放入机器本地内存空间中(MetaData)。

      1. 通过jstat命令进行查看堆内存使用情况

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。

命令的格式如下:

jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

        • 查看class加载数统计

命令:jstat -class 3694

        • 查看编译统计

命令:jstat -compiler 3694

        • 垃圾回收统计

命令:jstat -gc 3694

查看进程11005的GC信息 间隔1秒1次,打印5次

命令:jstat -gc 11005 1000 5

    1. jmap使用以及内存溢出分析(jmap命令用的比较多)

前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容。如:内存使用情况的汇总、对内存溢出的定位与分析。

      1. 查看内存使用情况

命令:jmap -heap 3694

解释:

Java命令学习系列(三)——Jmap -腾讯云开发者社区-腾讯云

      1. 查询内存中对象数量及大小

命令:jmap -histo 3331

      1. 查询内存中活跃的对象数量及大小

命令:jmap -histo:live 25834| more

      1. 将内存使用情况dump到文件中

通过浏览器访问解析后的文件

http://localhost:8888

如果有防火墙,开放8889端口

jhat还提供了查询功能,在页面的最后面

    1. MAT工具使用详解
      1. MAT工具介绍

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

      1. 下载安装

旧版本下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation

      1. 使用

    1. 内存溢出定位与分析实战

内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出 现了死循环,读取超大的文件等等,都可能会造成内存溢出。

如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正 常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug,我们需要借助于jmap与MAT工具进行定位分析。

接下来,我们模拟内存溢出的场景。

1、模拟内存溢出

编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程序能够正常执行,最后打印ok(idea编辑器中需要设置内存溢出相关参数)

#参数如下:

‐Xms8m ‐Xmx8m ‐XX:+HeapDumpOnOutOfMemoryError

package com.zte.oom;

import java.util.ArrayList;import java.util.UUID;

/**************************************************

 *

 * @title qq184480602

 * @desc ling

 * @author smart哥

 *

 **************************************************/

public class TestOOM {

    public static void main(String[] args) {

        ArrayList<String> stringArrayList = new ArrayList<>();

        for (int i = 0; i <1000000 ; i++) {

            String str="";

            for (int j = 0; j <1000 ; j++) {

                str=str+UUID.randomUUID().toString();

            }

            stringArrayList.add(str);

        }

        System.out.println("it is over!!");

    }

}

#设置VM options:

-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

大白话:

在VMOptions中设置-XX:+HeapDumpOnOutOfMemoryError,当出现堆栈溢出的时候,dumpJVM堆栈信息到java_pid32216.hprof文件,32216为程序在系统中的进程号。

2、运行测试

运行一段时间后会抛出java.lang.OutOfMemoryError: Java heap space 异常。

可以看到,发生了内存溢出,此时会dump文件到java_pid13320.hprof文件中。

3、导入到MAT工具中进行分析

查看Leak Suspects视图

可以看到,有89.07%的内存由Object[]数组占有,所以比较可疑。 分析:这个可疑是正确的,因为已经有超过89%的内存都被它占有,这是非常有可能出现内存溢出的,一般达到60%-70%就可以确实是这引起的内存溢出了。 查看Object Details视图详情如下

查看Object Details视图

可以看到集合中存储了大量的uuid字符串。

继续查看dominator视图进一步验证。

查看dominator视图

    1. jstack使用详解及定位死锁问题
      1. jstack的使用

        • 回顾线程的状态

        • 实战:死锁问题

    1. jvisualvm使用详解及定位死锁问题
      1. jvisualvm使用详解

      1. 启动

      1. 查看本地进程

      1. 查看CPU、内存、类、线程运行信息

      1. 查看线程详情

      1. 抽样器

      1. 监控远程的jvm

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

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

相关文章

C与C++编程语言的区别和联系

一、引言 C和C是两种广泛使用的编程语言&#xff0c;它们都在软件开发领域有着广泛的应用。虽然C是从C语言演化而来的&#xff0c;但两者之间存在一些重要的区别和联系。本文将详细介绍这两种编程语言的相同点和不同点&#xff0c;并通过实际例子进行说明。 二、C与C的相同点 …

如何查看Linux中glibc的Version

用ldd --version ldd --version 运行libc.so 你没有看错&#xff0c;libc.so是一个可执行程序。 但前提是你要找到它。因为它并不在PATH所包含的目录下。 ppdell:~$ ldd which cat | grep libclibc.so.6 > /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e6fb34000)ppdell:~…

GPT-4.5 要来了!谷歌大模型 Gemini 确实给够压力

GPT-4 还没用明白&#xff0c;GPT-4.5 就要发布了。 最近&#xff0c;OpenAI 泄露了 GPT-4.5 的发布页面&#xff0c;除了进一步增强复杂推理和跨模态理解&#xff0c;GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持&#xff0c;也就意味着多模态最后一块版图…

国产Apple Find My「查找」认证芯片-伦茨科技ST17H6x芯片

深圳市伦茨科技有限公司&#xff08;以下简称“伦茨科技”&#xff09;发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家&#xff0c;该平台提供可通过Apple Find My认证的Apple查找&#xff08;Find My&#xff09;功能集成解决方案。…

基于ssm毕业生跟踪调查反馈系统的设计与实现论文

面向工程教育专业认证的毕业生跟踪调查反馈系统 摘要 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了面向工程教育专业认证的毕业生跟踪调查反馈系统的开发全过程。通过分析企业对于面向工程教育专业认证的毕业生跟踪调查反馈系统…

内销开发信的跟进策略?开发信的关键要素?

如何写吸引人的内销开发信&#xff1f;优秀内贸开发信模板推荐&#xff1f; 在当今竞争激烈的市场中&#xff0c;内销开发信扮演着关键的角色&#xff0c;是吸引客户、拓展市场的重要工具。然而&#xff0c;发送一封内销开发信并不是终点&#xff0c;而是一个开始。蜂邮EDM将探…

基于Modis的遥感数据的地表温度的获取解决方案----以京津唐为例

1.背景与技术路线 地表温度(LST)是区域和全球尺度地表物理过程中的一个关键因子,也是研究地表和大气之间物质交换和能量交换的重要参数。许多应用如干旱、高温、林火、地质、水文、植被监测,全球环流和区域气候模型等都需要获得 LST。本方案以北京为例采用星载传感器的红外通道…

docker-harbor仓库

Docker 镜像 容器 仓库 仓库&#xff1a;保存镜像 私有&#xff1a;自定义用户的形式登录仓库&#xff0c;拉取或者上传镜像&#xff08;内部管理的用户&#xff09; Harbor&#xff1a;是VMware公司开发的&#xff0c;开源的企业级的docker register项目 帮助用户快速的搭建…

ZeroSSL-ip证书配置

1.申请证书 Free SSL Certificates and SSL Tools - ZeroSSL 2.填入公网 IP 地址 3.选择90天免费 SSL 4.自动生成CSR 5.选择文件验证方式 使用80端口,建立对应的文件并进行访问测试 6. 进行认证 7.下载证书并进行配置 8.合并ssl证书 对于 Nginx 服务器,需要将 ca_bundle.crt…

ARM开发

ARM课程介绍 课程特点 ARM开发 --> Linux移植 --> 驱动开发 前后联系&#xff1a;ARM和系统移植为驱动开发学习做准备工作 所需知识&#xff1a;C语言基础及STM32需要的硬件知识 课程要求 目标&#xff1a;学习程序运行原理、硬件的控制原理 会看原理图、芯片手册、学习…

使用docker安装nginx访问web

文章目录 一、拉取nginx镜像二、相关准备2.1、新建目录2.2、nginx配置文件2.3、前端代码 三、启动容器四、验证4.1、服务器上curl验证4.2、浏览器上验证4.3、问题排查 五、其它命令5.1、停止容器5.2、删除容器5.3、重启容器5.4、将nginx配置文件copy到宿主机中 六、最后 一、拉…

“追求卓越·数创未来”CITE2024深圳电子展,火爆招商中

展望2023年下半年及2024年&#xff0c;IDC预测&#xff0c;随着全球经济回暖&#xff0c;手机、智能家电、智能汽车等下游消费电子市场需求复苏&#xff0c;芯片库存持续去化&#xff0c;价格趋于平稳&#xff1b;而随着需求侧增长驱动供给侧产能逐步释放&#xff0c;供需错配或…

vue chrome debugger 无效

昨天晚上debbger可以正常运行的&#xff0c;但是早上起来突然间所有的debugger都不会被命中&#xff0c;重装了vscode,也清了浏览器缓存&#xff0c;可是这个bitch还是不行&#xff01;整整折腾了一早上&#xff0c;就是无法解决&#xff0c;没办法只能找找资料 &#xff0c;搜…

基础算法(3):排序(3)插入排序

1.插入排序实现 插入排序的工作原理是&#xff1a;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已经排序的序列从后向前扫描&#xff0c;找到位置并插入&#xff0c;类似于平时打扑克牌时&#xff0c;将牌从大到小排列&#xff0c;每次摸到一张牌就插入到正确的位…

关于set和map的简单理解

1. 关于搜索 1.1 set和map的引入 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有&#xff1a; 1. 直接遍历&#xff0c;时间复杂度为O(N)&#xff0c;元素如果比较多效率会非常慢 2. 二分查找&…

数智化时代,亚信安慧AntDB邀您一起复盘年度100个值得学习的好案例

全球软件案例研究峰会&#xff08;简称“壹佰案例”&#xff09;是科技界一年一度的案例研究榜单&#xff0c;它萃取了100位领先企业的核心思路及战略方法&#xff0c;旨在发现有案例教学意义的项目或方法论。 湖南亚信安慧科技有限公司AntDB-T产品线负责人洪建辉先生受邀出席此…

Docker知识点整理

Docker和虚拟机技术的区别&#xff1a; 传统的虚拟机&#xff0c;可以虚拟出一条硬件&#xff0c;运行一个完整的操作系统&#xff0c;在这个操作系统上安装和运行所需的软件 容器内的应用可以直接运行在宿主 主机的内核中&#xff0c;容器没有自己的内核&#xff0c;也不用虚…

linux文件打包和压缩

7.2 文件打包和压缩 7.2.1 tar tar&#xff08;英文全拼&#xff1a;tape archive &#xff09;命令用于备份文件。 ​ tar 是用来建立&#xff0c;还原备份文件的工具程序&#xff0c;它可以加入&#xff0c;解开备份文件内的文件。 ​ tar命令是Unix/Linux系统中备给文件的…

ROS2 学习08 导航Nav2:简介、安装、测试效果、错误处理

1、简介 在ROS2中自动导航使用Nav2来实现。 Nav2 使用几个独立的模块化服务&#xff0c;通过 ROS 2接口&#xff08;例如动作服务器或服务&#xff09;与行为树 (BT) 通信。 Nav2 输入包括&#xff1a;TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源; Nav…

UE虚幻引擎中程序无需运行也可调试

首先先新建一个蓝图类&#xff0c;在蓝图类中创建一个Custom event 事件&#xff0c;然后在右侧细节面板中搜索call in editor&#xff0c;编译保存之后&#xff0c;将该蓝图类拖拽到关卡场景中&#xff0c;在细节面板中即可看到该事件的按钮。