JVM运行参数_JVM内存模型_常用内存分析工具

JVM运行参数

常见标准参数

  • -showversion: 显示当前JVM版本等信息
  • -D设置系统属性参数:
/*** 测试* @author regotto*/
public class JvmTest {public static void main(String[] args) {//获取系统参数String str = System.getProperty("str");System.out.println(str);}
}

在IDEA的运行配置环境中添加VM options
在这里插入图片描述
运行结果: hello

  • server, client参数
server: 初始堆空间大, 并行垃圾回收, 启动慢, 运行快
client: 初始堆空间小, 串行垃圾回收, 启动快, 运行慢
默认64操作系统只有server类型

常见-X非标准参数

  • -Xint: 强制JVM执行所有字节码, 运行速度降低较为严重
  • -Xcomp: 与Xint相反, JVM第一次使用把所有的字节码编译生成本地代码, 提高代码优化程度(-Xcomp没有让JVM启用JIT编译器全部功能, JIT可以自行决定哪些代码编译, 哪些代码不编译), 也存在运行速度下降, 相比于Xint, -Xcomp较好
  • -Xmixed: 解释模式与编译模式的混合, 让JVM自行决定使用哪种方式进行编译

常见-XX非标准参数(常用于JVM调优/debug操作)

boolean类型: -XX:[+-]<name>	+表示启用属性, -表示禁用属性例: -XX:+DisableExplicitGC 禁止手动调用GC
非boolean类型:-XX:<name>=<value> 设置name值为value例: -XX:NewRatio=1 设置新老代比值
  • -Xms: 设置jvm的堆内存大小, 例: -Xms512m 等价于 -XX: InitialHeapSize=512m
  • -Xmx: 设置堆内存最大值, 例: -Xmx2048m 等价于 -XX: MaxHeapSize=2048m

查看JVM运行参数

  • 运行时打印参数: -XX:+PrintFlagsFinal
    在这里插入图片描述
    查询打印的运行参数如下:在这里插入图片描述
    根据上图, 等号后面是数字 => 非boolean类型-XX参数; 等号后面是true/false => boolean类型-XX:参数; =, :=代表默认值与被修改的值
  • 查看正在运行的JVM参数: jinfo -flags 进程端口; 查看指定属性的值: jinfo -flags 属性 进程端口

JVM内存模型

1.7版本与1.8版本内存模型在这里插入图片描述

各区域说明

Young: 年轻代=> 包含Eden, 2*Survivor, 其中一个Survivor用于存放GC时存活的对象, 经历几次垃圾回收, Survivor中存活对象转移到Tenured
Tenured: 老年代存放生命周期长的对象, 对象在Young中区域中, 经历多次GC都还存活, 才能转移到Tenured, 当生产一个大对象时, 会直接移动到老年代中
Perm: 1.7版本, 保存class, method, field对象. 很少出现OOM
MetaspaceVM: 1.8版本, 使用元数据空间替换Perm区, 存放位置放置在直接内存中, 不再占用虚拟机空间
Virtual: 最大内存与初始内存的差值

弃用1.7Perm永久区说明

根据官方说明: 融合HotSpot, JRockit(不存在永久代), 且永久代容易出现OOM

jstat使用

jstat: 用于查询堆内存各部分使用情况, 加载类数量
在这里插入图片描述

Loaded: 加载class数量	Bytes: 占用空间大小	Unloaded: 未加载数量	Bytes: 未加载空间	Time: 时间

查看当前应用编译情况
在这里插入图片描述

Compiled:编译数量。 Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 FailedMethod:失败的方法

查看当前应用GC情况
在这里插入图片描述

S0C:第一个Survivor区的大小(KB) S1C:第二个Survivor区的大小(KB) S0U:第一个Survivor区的使用大小(KB) S1U:第二个Survivor区的使用大小(KB) 
EC:Eden区的大小(KB) EU:Eden区的使用大小(KB) OC:Old区大小(KB) OU:Old使用大小(KB)
MC:方法区大小(KB) MU:方法区使用大小(KB) CCSC:压缩类空间大小(KB) CCSU:压缩类空间使用大小(KB) 
YGC:年轻代垃圾回收次数 YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数 FGCT:老年代垃圾回收消耗时间 GCT:垃圾回收消耗总时间

动态查看应用运行情况: jstat -gc 13880 1000 5 => 每隔1s打印一次, 总共打印5次

jmap使用

jmap: 相比于jstat, jmap能获取更加详细的内容
查看当前应用堆情况:
在这里插入图片描述
查看应用存活对象:
在这里插入图片描述
jmap -histo 105772 代表查看所有对象, 包括死亡的对象

对象说明:
B byte 
C char 
D double 
F float 
I int 
J long 
Z boolean 
[ 数组,如[I表示int[] [L+类名 其他对象

将内存使用情况dump到文件中, jhat对dump文件分析

jmap -dump:format=b, file=dumpFileName 应用端口
在这里插入图片描述
jhat -port 端口 dump文件
在这里插入图片描述
可以对上面的内容进行检查, 快速定位分析问题, 哪个地方有大对象产生, 那个地方的内存分配不合理等情况

模拟内存溢出, 使用Eclipse Memory Analyzer进行分析

import java.util.ArrayList;
import java.util.UUID;/*** 内存溢出测试* @author regotto*/
public class JvmTestOutOfMemarry {public static void main(String[] args) {ArrayList<String> strings = new ArrayList<String>();for (int i = 0; i < 10000000; i++) {String s = "";for (int j = 0; j < 10000; j++) {s += UUID.randomUUID().toString();}strings.add(s);}System.out.println("Ok");}}

在这里插入图片描述
-XX:HeapDumpOnOutOfMemoryError: 设置程序内存溢出时, 自动生成dump文件
在这里插入图片描述
将在项目下生成的java_pid175420.hprof导入Eclipse Memory Analyzer工具
在这里插入图片描述
查看分析报告: 在main函数中, 存在本地变量占用73.09%的内存空间, 点击see stacktrace查看线程栈调用情况, 如下图, 可以看出StringBuilder.append导致内存溢出情况
在这里插入图片描述

jstack查看jvm线程情况

jstack pid
在这里插入图片描述

Java VisualVM

使用方式 => 自行百度
注: 监控远程服务器上的程序, 需要配置JMX才能进行JMX连接

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

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

相关文章

2019 年入门AI算法工程师,你需要掌握什么技能?

一篇推文&#xff0c;感兴趣的同学可以了解一下&#xff0c;有需要请继续往下阅读&#xff0c;没有需要的打扰各位金主了-----人工智能与自然语言处理/计算机视觉课培训招生Artificial Intelligence ForNLP/CV Courses真实企业级项目驱动找工作拿不到offer全额退款GitHub年度活…

腾讯云安全组规则导出

规则协议 端口 来源 策略 备注 TCP 23232,23235,23236,23240,21101 0.0.0.0/0 允许 TCP 28000-28040 0.0.0.0/0 允许 TCP 23241,23242,23240 0.0.0.0/0 允许 TCP 6000-7000 0.0.0.0/0 允许 ALL ALL 122.152.196.158 允许 ALL ALL 10.0.0.213 允许 ALL ALL 10.0.0.2 允许 ALL AL…

python循环套循环_零基础学python 14 循环套循环:循环的嵌套

大家可以回忆一下&#xff0c;之前我们学习过的循环结构。也就是for循环结构&#xff0c;今后我们还将学习另一种循环结构while结构&#xff0c;这里先不细讲。当初我们学习for循环结构的时候&#xff0c;有心的同学或许会发现&#xff0c;我们的for结构一般都是单独写单独出现…

Java常见GC算法_垃圾收集器及内存分配_G1垃圾收集器

常见GC算法 引用计数法: 每个对象都有一个计数器, 对象被引用一次, 计数器1, 当对象引用失败一次. 计数器-1, 当对象计数器等于0, 说明对象没有被应用, 就可GC 优: 运行过程中, 可随时检查对象计数器, 进行GC, 且GC过程, 应用无需暂停, 执行速度快(单个对象GC不会影响其他对…

是应该有点兴奋剂刺激下

不知道你有没有发现一个问题&#xff0c;发现身边的很多人工资很高&#xff0c;但是好像总还是缺点什么&#xff0c;总是对生活提不起兴趣&#xff0c;似乎对任何事情都失去热情&#xff0c;每天拿着手机&#xff0c;点来点去&#xff0c;每天都在抱怨&#xff0c;每天都好像在…

你应该知道为什么需要内核

不知道大家想过这个问题没有&#xff1f;为什么要有内核&#xff1f;如果没有内核有怎么样呢&#xff1f;因为有了 unix 内核&#xff0c;有了 minix 后面又有了 Linux 内核&#xff0c;内核这个思想越来越根深蒂固&#xff0c;估计没学什么计算机知识的人都能侃出点所以然来。…

FTP 协议和 HTTP 协议的比较

参考&#xff1a;http://www.oschina.net/news/28162/http-vs-ftp 以下列出了一些两者的不同点&#xff1a; 1、HTTP协议是用来浏览网站的&#xff0c;而FTP是用来访问和传输文件的&#xff0c;FTP文件传输有点批量上传和维护网站的意思&#xff0c;而HTTP文件传输更多的是为终…

线程基础知识_Synchronized_ThreadAPI_自定义锁_获取线程运行时异常

Synchronized synchronized包含monitor enter, monitor exit 2个JVM指令(遵循happens-before原则), 执行monitor exit之前必须存在monitor enter指令. 由于每个对象与一个monitor产生关联, 线程执行monitor enter时, 就会获取monitor的lock, monitor中存在计数器, 用于记录当前…

32位和64位系统区别及int字节数

一&#xff09;64位系统和32位有什么区别&#xff1f; 1、64bit CPU拥有更大的寻址能力&#xff0c;最大支持到16GB内存&#xff0c;而32bit只支持4G内存 2、64位CPU一次可提取64位数据&#xff0c;比32位提高了一倍&#xff0c;理论上性能会提升1倍。但这是建立在64bit操作系…

在统计学中参数的含义是指_《统计学》名词解释及公式

章节主要内容学习要点1.1统计及其应用领域什么是统计学概念&#xff1a;统计学&#xff0c;描述统计&#xff0c;推断统计。统计的应用领域统计在工商管理中的应用。统计的其他应用领域。1.2数据的类型分类数据、顺序数据、数值型数据概念&#xff1a;分类数据&#xf…

2019深圳入户攻略

我上次说了&#xff0c;等我把户口办好了&#xff0c;我就把攻略写出来&#xff0c;给大家一个参考&#xff0c;今天刚好是我最后的一个步骤&#xff0c;去派出所把身份证给办了&#xff0c;好了&#xff0c;我以后就是深圳人了&#xff0c;来深圳快十年了&#xff0c;现在才真…

NIO之ByteBuffer_NIO之网络IO_与ChannelNetty初窥门径

NIO之ByteBuffer与Channel 传统IO:byte[] < inputStream < 文件 > outputStream > byte[] NIO:文件 > inputChannel <> buffer <> outputChannel > 文件文件 < inputChannel <> outputChannel > 文件文件复制, 并测试ByteBuffer常用…

ubuntu 12.04 samba 服务器搭建

为什么要搭建samba 服务器 我在 windows 下安装了个虚拟机,然后想两边同步下资料,原来虚拟机是可以共享文件的,可是不知道什么见鬼了,就是不行,没办法了,我只好拿出我的杀手锏,安装 samba 安装 samba 工具 安装samba:sudo apt-get install samba 安装smbclient:sud…

mp4 拍摄时间如何看_时间不多了,如何备考期末最有效?这些复习技巧,看了你就会了...

再过不到一个月就要过年了&#xff0c;虽然天气越来越冷&#xff0c;但是有阻挡不了年度大戏“期末考”的前进步伐&#xff0c;尤其是对于紧张复习之中的高考备考生而言&#xff0c;高三第一学期的期末考就可以算是对自己第一轮复习的一个检验&#xff0c;如果成绩不理想&#…

vue实战学习第二天

1.怎么运行别人的项目 步骤一&#xff1a;搭建脚手架&#xff1a;npm i -g vue-cli 步骤二&#xff1a;vue init webpack 不要一直默认回车&#xff0c;去除一些不必要的依赖&#xff0c;减少代码的编写难度 步骤三&#xff1a;下载依赖的文件 npm i &#xff08;可能有些人会…

Netty之自定义RPC

需求分析 使用netty实现方法远程调用, 在client调用本地接口中方法时, 使用反射进行远程调用, server执行完结果后, 将执行结果进行封装, 发送到client RPC调用模型: 1. 服务消费方(client)以本地调用方式调用服务 2. client stub 接收到调用后负责将方法、参数等封装成能够…

vue垂直布局_vue实现长图垂直居上 vue实现短图垂直居中

大致效果如下图&#xff0c;只考虑垂直方向。长图可以通过滚动条看&#xff0c;短图居中效果&#xff0c;布局合理html代码(vue作用域内)&#xff1a;css代码&#xff1a;.box{height: 100%;//如高度等于网页高度overflow: auto;display: flex;flex-direction: column;justify-…

samba 服务器搭建

为什么要搭建samba 服务器我在 windows 下安装了个虚拟机&#xff0c;然后想两边同步下资料&#xff0c;原来虚拟机是可以共享文件的&#xff0c;可是不知道什么见鬼了&#xff0c;就是不行&#xff0c;没办法了&#xff0c;我只好拿出我的杀手锏&#xff0c;安装 samba。这个在…

Codis的源码编译生成tar包

一、Go环境的安装 1、下载地址 https://golang.org/dl/2、解压 tar -zxvf go1.7.1.linux-amd64.tar.gz -C /usr/local 3、修改配置文件   vi /etc/profile     export GOROOT/usr/local/go     export GOPATH/usr/local/data/go     export PATH$PATH:$GOROOT/b…

一直想说的,技术职业化

最近后台有人一直跟我说&#xff0c;为什么不好好写一篇技术比较强的文章&#xff0c;说实话&#xff0c;最近时间比较紧张&#xff0c;早上 8 点出门&#xff0c;晚上12点左右到家。刚好今天整理了一个不错文章的列表&#xff0c;明天发出来&#xff0c;希望给学习的同学们有点…