JVM规范定义的内存结构

java8已经没有了方法区这个概念,改为了metaspace,存储字符串常量池、静态变量。
Java8的内存结果

jps (JVM process status)可以查看Java虚拟机进程执行情况,-l显示具体的启动类,-m显示具体的入参。-v显示启动配置的jvm参数

jps -l

jstats(JVM statistic Monitoring tool):查看虚拟机上各项运行状态信息。
查看虚拟机号为5640的gc情况。

jstat -gc 5640 100

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000
2560.0 2560.0  0.0    0.0   15360.0   3696.2   40960.0      0.0     4480.0 774.9  384.0   75.9       0    0.000   0      0.000    0.000

S0C S1C S0U S1U survivor0和survivor1
EC EU 新生代 总量和使用
OC OU 老生代 总量和使用
MC MU metaspace 总量和使用
CCSC CCSU 压缩类总量和使用
YGC YGCT younggc的次数和时间
FGC FGCT Full的次数和时间
GCT 总的gc时间

jinfo:查看和调整虚拟机的各项参数

jinfo -flag

如查看是否使用了UseSerial垃圾回收器

jinfo -flag UseSerialGC 5640


使用的减号,那么没用用UseSerial收集器。

查看所有的jvm参数

jinfo -flags 7395
Attaching to process ID 7395, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.101-b13
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=262144000 -XX:MaxHeapSize=4164943872 -XX:MaxNewSize=1388314624 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=87031808 -XX:OldSize=175112192 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Command line:  -Dspring.config.location=application-pro.yml -Dspring.profiles.active=pro

jmap(JVM Memory Map For Java):生成堆内存快照,

jmap -dump:format=b,file=jmapDumpFile 3137

也可以在出现内存溢出后自动生成dump文件。利用jdk目录下\jdk1.8.0_144\bin提供的jvisualvm.exe打开。jvisualvm.exe同时支持在线监控,
定位频繁gc测试代码

    @GetMapping("/oom")public Integer oom(){final Thread thread = new Thread(new Runnable() {@Overridepublic void run() {List<User> userList = new ArrayList<>();for (int i = 0; i < 1000 * 10000; i++) {User user = new User();user.setId(i);user.setUserName("u" + i);user.setPassword("123");user.setCreateTime(new Date());user.setExp1("");user.setExp2("");user.setExp3("");user.setExp4("");user.setExp5("");user.setExp6("");user.setExp7("");user.setExp8("");user.setExp9("");user.setExp10("");user.setExp11("");user.setExp12("");user.setExp13("");user.setExp14("");user.setExp15("");user.setExp16("");user.setExp17("");user.setExp18("");user.setExp19("");user.setExp20("");userList.add(user);}try {Thread.sleep(10000000);} catch (InterruptedException e) {e.printStackTrace();}}});thread.setName("测试线程");thread.start();return 1;}

调整jvm执行时的最大内存

-Xmx1024m

执行如上的耗时代码,在jvisualvm.exe可看到如下图选。

普通不耗时的请求也无法处理。

Exception in thread "测试线程" java.lang.OutOfMemoryError: GC overhead limit exceededat java.util.Arrays.copyOfRange(Arrays.java:3664)at java.lang.String.<init>(String.java:207)at java.lang.StringBuilder.toString(StringBuilder.java:407)at com.test.controller.UserController$3.run(UserController.java:76)at java.lang.Thread.run(Thread.java:748)
2021-01-18 17:04:49.049  WARN 5956 --- [MI TCP Accept-0] sun.rmi.transport.tcp                    : RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,localport=54683] throwsjava.lang.OutOfMemoryError: GC overhead limit exceededat java.net.NetworkInterface.getAll(Native Method) ~[na:1.8.0_131]at java.net.NetworkInterface.getNetworkInterfaces(NetworkInterface.java:343) ~[na:1.8.0_131]at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:86) ~[na:1.8.0_131]at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:400) [na:1.8.0_131]at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:372) [na:1.8.0_131]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131]

点击jvisualvm.exe生成dump文件。使用momery analyzer分析

显示一个线程生成了太多本地变量,查看stacktrace信息

可以查看到具体的堆栈信息。

jhat(JVM Heap Analysis Tool)分析jmap生成的堆内存快照。

jhat jmapDumpFile

显示Server is ready后在浏览器中输入http://192.168.209.101:7000查看结果
一帮查询堆内存中总容量最大的对象。

jstack:生成线程执行的栈信息,定位线程出现长时间停顿的原因

jstack -l 3137

生成线程dump文件,用jvisualvm.exe打开。

jstack -l 3137 >> thread.tdump

JDK目录\jdk1.8.0_144\bin下提供了图形化的界面显示内存、线程执行情况的工具jconsole.exe,进入之前选择对应的虚拟机即可。

如果出现空循环的问题,可通过堆栈查看出来
测试代码:

    public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(new Runnable() {@Overridepublic void run() {while (true){}}},"testBusyThread");thread.start();Thread.sleep(1000000);}

定位线上CPU使用率过高的问题。
模拟该场景,在main函数中写个死循环,使用top命令得到该进程id。

使用jps -l查询得到是那个项目

如下命令得到占用的线程

ps -mp 2050 -o THREAD,tid,time

time为占用的时间,tid为线程id

-m显示所有的线程
-p pid进程使用cpu的时间
-o 使用用户自定义的格式。
或者用如下命令

top -Hp 17583


占用的线程为2051,需要转换为16进制。

printf "%x\n" 2051

得到803,如果出现16进制数为字母,需要转为小写。

如下命令得到具体那个线程

jstack 2050 |grep 803 -A60

整体流程为:
1通过top得到占用过高的进程id\color{#FF0000}{1 通过top得到占用过高的进程id}1通过top得到占用过高的进程id
2通过ps−mp得到占用过高的线程id\color{#FF0000}{2 通过ps -mp得到占用过高的线程id}2通过ps−mp得到占用过高的线程id
3通过jstack进程id得到线程快照,从快照中grep那个线程id,即可得到具体是那个线程执行的那个代码块\color{#FF0000}{3 通过jstack 进程id得到线程快照,从快照中grep那个线程id,即可得到具体是那个线程执行的那个代码块}3通过jstack进程id得到线程快照,从快照中grep那个线程id,即可得到具体是那个线程执行的那个代码块

部分摘自某课网

Java--定位问题工具相关推荐

  1. Java诊断工具-Arthas入门与实践

    Java诊断工具-Arthas入门与实践 目录 Java诊断工具-Arthas入门与实践 什么是Arthas? Arthas能做什么? 我在哪里可以下载Arthas? 快速入门 1. 下载并运行mat ...

  2. Java开发工具简介

    Java语言是一种解释性的语言,即读一句程序执行一句,这样就需要一 个解释器完成源程序到机器语言的翻译过程.同时Java是跨平台的语 言,跨平台是指Java程序可以在安装任何操作系统的计算机上运行,起 ...

  3. java+构建+工具+Ant+Maven+Gradle

    java+构建+工具+Ant+Maven+Gradle Ant+Maven+Gradle+............ 目前: Ant已经销声匿迹.Maven也没落了,而Gradle的发展则如日中天. M ...

  4. java myeclipse 下载_myeclipse 10|MyEclipse(优秀的Java开发工具myeclipse下载) 10.7官方版下载 - 下载吧...

    MyEclipse10官方下载是一款非常优秀的Java开发工具.MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错.MyEclipse目前支持Java Servlet ...

  5. jar java classpath_win7中java编程工具安装 java环境变量设置

    win7中java编程工具安装 java环境变量设置 Question:编译是显示'javac'不是内部或外部命令,也不是可运行的程序或批处理文件 解决: 在[系统变量]里编辑java_home.cl ...

  6. java 开发工具_Java开发工具和环境,你了解多少?

    Java作为今年来最热门的编程语言之一,越来越多的人选择Java,但对于一些初入门的小白来说,在选择和安装开发工具和环境的时候,会遇见很多的问题. 今天就给大家来分享一些实用的Java开发工具和环境, ...

  7. UrlUtils工具类,Java URL工具类,Java URL链接工具类

    UrlUtils工具类,Java URL工具类,Java URL链接工具类 >>>>>>>>>>>>>>>&g ...

  8. 主流Java报表工具的比较

    从部署.展示.设计等方面,全面比较Java报表工具,如 润乾 , 杰表 ,Style Report,Jasper等,以及声称支持Java的Crystal Report,数巨等. Java报表工具,首先 ...

  9. idea如何删除java里面工程,Java开发工具IntelliJ IDEA配置项目系列教程(七):卸载模块...

    IntelliJ IDEA是Java语言开发的集成环境,IntelliJ在业界被公认为优秀的Java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合. ...

  10. 25个Java机器学习工具库

    本列表总结了25个Java机器学习工具&库: 1. Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预 ...

最新文章

  1. 影响生产计划制定的因素_石料生产线选砂石原骨料时的技巧及影响破碎的因素...
  2. 服务器ssr进程启动怎么运行,要SSR? NUXT项目从初始化到部署服务器流程全记录
  3. node mysql 跨库查询_nodejs 在mongodb在跨数据库之中如何进行关联起来查询,并且支持筛选关联表的条件进行查询...
  4. HBase基本概念与基本使用
  5. (57)Verilog HDL选择运算符:?
  6. 彻底解决VS中找不到 Windows SDK 版本 8.1的错误
  7. 【CVRP】基于matlab遗传算法求解带容量的车辆路径规划问题【含Matlab源码 1280期】
  8. 【ENVI】FLAASH大气校正工具中比例因子说明
  9. 计网考点 无线局域网
  10. 知识图谱 01:知识图谱概述
  11. 【钉钉-场景化能力包】CRM销售系统集成
  12. 乳企齐冲上市,是百家争鸣还是内卷加剧?
  13. 2016年-2021年【总目录】
  14. 【vn.py】期货穿透式CTP API接入
  15. 三星N9109W刷机教程(线刷官方固件rom包)
  16. 如何在iPhone手机里创建网页快捷方式图标(Web Clip)
  17. BetaFlight深入传感设计之八:坐标系
  18. 【图像分类】基于PyTorch搭建LSTM实现MNIST手写数字体识别(双向LSTM,附完整代码和数据集)
  19. AutoDesk CAD2018 ObjectArx + vs2015 +win10 (C++)环境配置
  20. 文件加密,解密,解除加密

热门文章

  1. Shiro教程,整合SpringBoot项目实战(笔记)
  2. css border实现图形
  3. 信创实践之达梦数据库介绍
  4. 北京上地海淀IDC数据中心机房托管-永丰数据中心
  5. java 对象和List 里面的对象判断属性是不是为空
  6. Maven 常用镜像站地址
  7. 最容易被盗的密码,您有用过吗?
  8. 345.反转字符串中的元音字母(Reverse Vowels of a String)
  9. Unity将世界坐标转为UI坐标
  10. 浏览器旧版本下载地址汇总——持续更新