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

一、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.rhkb.cn/news/217673.html

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

相关文章

vue2项目vue-qrcode-reader 扫一扫二维码插件

vue2项目 vue-qrcode-reader 扫一扫二维码插件 问题所在解决办法成功展示 问题所在 今天在引导师弟做扫二维码功能&#xff0c;发现通过npm install --save vue-qrcode-reade安装死活就是报错TypeError: Object...) is not a function 解决办法 百度了很多大牛的博客&#…

uniCloud(一) 新建项目、初始化服务空间、云对象访问测试

一、新建一个带有unicloud 二、创建一个服务空间 1. 右键uniCloud&#xff0c;关联云服务空间 我当前没有服务空间&#xff0c;需要新建一个服务空间&#xff0c;之后将其关联。初始化服务空间需要的时间有点长 服务空间初始化成功后&#xff0c;刷新HBuilder&#xff0c;勾选…

0012Java安卓程序设计-ssm记账app

文章目录 **摘要**目 录系统设计5.1 APP端&#xff08;用户功能&#xff09;5.2后端管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 网络的广泛应用给生活带来了十分的便利。所以把记账管理与现在网络相…

CanEasy多场景应用,让汽车总线测试更简单

来源&#xff1a;虹科汽车电子 虹科分享 | CanEasy多场景应用&#xff0c;让汽车总线测试更简单 原文链接&#xff1a;https://mp.weixin.qq.com/s/ojic4xfVTLbxXcKlJMGQZw 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 CanEasy是一个基于Windows的总线工具&…

ChatGPT对话为什么不用WebSocket而使用EventSource?

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …

二叉搜索树的简单理解

1. 二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它…

监听器中GUI的理解

文章目录 前言一、Panel窗口关闭Demo总结 前言 比如登录拦截&#xff1a;用户登录后&#xff0c;会被拦截掉。就可以用监听器来处理。 一、Panel窗口关闭Demo 先创建一个窗口&#xff0c;发现点击关闭后&#xff0c;关闭不掉&#xff0c;就要添加监听事件&#xff1a; pub…

The method show() from the type Window is deprecated

java.awt.Window.show() java.awt.Component.setVisible(true); Window.show() java.awt.JFrame java.awt.Frame java.awt.Windows java.awt.Component.setVisible(true);

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

Elasticsearch:为现代搜索工作流程和生成式人工智能应用程序铺平道路

作者&#xff1a;Matt Riley Elastic 的创新投资支持开放的生态系统和更简单的开发者体验。 在本博客中&#xff0c;我们希望分享 Elastic 为简化你构建 AI 应用程序的体验而进行的投资。 我们知道&#xff0c;开发人员必须在当今快速发展的人工智能环境中保持灵活性。 然而&a…

联邦蒸馏中的分布式知识一致性 | TIST 2024

联邦蒸馏中的分布式知识一致性 | TIST 2024 联邦学习是一种隐私保护的分布式机器学习范式&#xff0c;服务器可以在不汇集客户端私有数据的前提下联合训练机器学习模型。通信约束和系统异构是联邦学习面临的两大严峻挑战。为同时解决上述两个问题&#xff0c;联邦蒸馏技术被提…

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上&#xff0c;运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中&#xff0c;遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

人工智能|深度学习——知识蒸馏

一、引言 1.1 深度学习的优点 特征学习代替特征工程&#xff1a;深度学习通过从数据中自己学习出有效的特征表示&#xff0c;代替以往机器学习中繁琐的人工特征工程过程&#xff0c;举例来说&#xff0c;对于图片的猫狗识别问题&#xff0c;机器学习需要人工的设计、提取出猫的…

Axure的使用

1.Axure是什么&#xff1f;&#xff1f;&#xff1f; Axure是一款功能强大的原型设计工具&#xff0c;它可以让用户快速地创建交互式原型&#xff0c;并针对原型进行测试和改进。Axure的主要特点包括可定制的界面元素库、交互动画效果、条件逻辑、团队协作等功能&#xff0c;适…

LabVIEW开发远程结构健康监测系统

LabVIEW开发远程结构健康监测系统 工程师依赖于振动监测来评估建筑物、桥梁和其他大型结构的完整性。传统的振动监测工具在数据收集上存在限制&#xff0c;无法长时间收集高保真波形。随着内存存储、处理器速度和宽带无线通信技术的进步&#xff0c;出现了对能够长时间收集并实…

Spark与PySpark(1.概述、框架、模块)

目录 1.Spark 概念 2. Hadoop和Spark的对比 3. Spark特点 3.1 运行速度快 3.2 简单易用 3.3 通用性强 3.4 可以允许运行在很多地方 4. Spark框架模块 4.1 Spark Core 4.2 SparkSQL 4.3 SparkStreaming 4.4 MLlib 4.5 GraphX 5. Spark的运行模式 5.1 本地模式(单机) Local运行模…

《PCL多线程加速处理》-滤波-统计滤波

《PCL多线程加速处理》-滤波-统计滤波 一、效果展示二、实现方式三、代码一、效果展示 提升速度随着点云越多效果越明显 二、实现方式 1、原始的统计滤波实现方式 #include <pcl/filters/statistical_outlier_removal.h>pcl::PointCloud<pcl::PointXYZ

vue2-elementUI部分组件样式修改

el-radio样式&#xff1a; /deep/ .el-radio__input .el-radio__inner {width: 20px;height: 20px;position: relative;cursor: pointer;-webkit-appearance: none;-moz-appearance: none;appearance: none;border: 1px solid #999;border-radius: 0;outline: none;transition…

【C语言】超详解strncpystrncatstrncmpstrerrorperror的使⽤和模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

张驰课堂:如何应用六西格玛法则优化你的工作流?

作为职场发展的坚实支柱&#xff0c;六西格玛不仅是企业提质增效的利器&#xff0c;同时也是那些渴望在职业生涯中脱颖而出的专业人士的的秘密武器。以下是通过培养个人技能&#xff0c;借助六西格玛优化工作与人生的途径。 团队合作&#xff1a;聚沙成塔的力量 六西格玛教我…