JVM实践

jmap命令讲解

参考文献1

  • 例如:
    • C:\Users\Administrator>jmap -heap 3444

开启JVM日志打印

  • VM options:
    • -verbose:gc -XX:+PrintGCDetails

设置JVM初始化内存为20M

  • VM options:
    • -Xms20M

设置JVM最大内存为20M

  • VM options:
    • -Xmx20M

设置JVM年轻带内存大小为10M

  • VM options:
    • -Xmn10M

设置JVM大对象分配区域判断条件

  • VM options:
    • -XX: PretenureSizeThreshold 1024

设置内存异常是保存内存快照

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath:/data/heap/error

JVM虚拟机工具-JPS

  • JPS是什么?

    • jps (JVM Process Status Tool)是其中的典型jvm工具。除了名字像 UNIX 的 ps 命令之外,它的功能也和 ps 命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class, main()函数所在的类)名称以及这些进程的本地虚拟机唯- ID (Local Virtual Machine Identifier, LVMID),虽然功能比较单一,但它是使用频率最高的 JDK 命令行工具
  • 实战使用

    • jps -l 输出主类的全名,如果进程执行的是Jar包则输出Jar路径
    • jps -v 输出虚拟机进程启动时JVM参数

JVM虚拟机工具-jstat

  • jstat是什么

    • Jstat (JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程-虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GU 图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具
  • jstat命令使用

     jstat -gc 2764 250 20   //2764表示进程id ,250表示250毫秒打印一次 ,20表示一共打印20次
     S0C:第一个幸存区的大小
     S1C:第二个幸存区的大小
     S0U:第一个幸存区的使用大小
     S1U:第二个幸存区的使用大小
     EC:伊甸园区的大小
     EU:伊甸园区的使用大小
     OC:老年代大小
     OU:老年代使用大小
     MC:方法区大小
     MU:方法区使用大小
     CCSC:压缩类空间大小
     CCSU:压缩类空间使用大小
     YGC:年轻代垃圾回收次数
     YGCT:年轻代垃圾回收消耗时间
     FGC:老年代垃圾回收次数
     FGCT:老年代垃圾回收消耗时间
     GCT:垃圾回收消耗总时间
    

JVM虚拟机工具-jinfo

  • jinfo是什么?

    • jinfo (Configuration Info for Java)的作用是实时地查看和调整虚拟机各项参数。使用 jps 命令的-v 参数可以查看虚拟机启动时显式指定的参数列表,但如果想知道未被显式指定的参数的系统默认值,除了去找资料外,就只能使用 info 的-flag 选项进行查询了
  • jinfo命令使用

    jinfo pid
    jinfo -flag CMSInititingOccupancyFraction 1444
    

JVM虚拟机工具-jmap

  • jmap是什么?

    • Jmap (Memory Map for Java)命令用于生成堆转储快照。如果不使用 jmap 命令,要想获取 Java 堆转储快照,还有一些比较“暴力”的手段:-XX: +HeapDumpOnOutOfMemoryError 参数,可以让虚拟机在 OOM 异常出现之后自动生成 dump 文件,用于系统复盘环节
    • 和 info 命令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了生成 dump 文件的- dump 选项和用于查看每个类的实例、空间占用统计的-histo选项在所有操作系统都提供之外,其余选项都只能在Linux/Solaris 下使用。
  • jmap常用命令使用

    //生成 Java 堆转储快照。格式为:-dump:  format=b, file= Filename
    windows: jmap -dump:format=b,file=d:\a.bin 1234
    mac:      jmap -dump:format=b,file=/Users/daniel/deskTop
    
  • histo more分页去查看

    • 显示堆中对象统计信息,包括类、实例数量、合计容量

    B :byte

    C : char

    I :Int

JVM虚拟机工具-jhat

  • jhat是什么?
    • Sun JDK 提供 jhat (JVM Heap Analysis Tool)命令常与 jmap 搭配使用,
      来分析 jmap 生成的堆 转储快照。jhat内置了一个微型的HTTP/HTML服务器,生成dump文件的分析结果后,可以在浏览器中查看
  • 特点:
    • jhat分析工作是一个耗时而且消耗硬件资源的过程
    • jhat 的分析功能相对来说比较简陋

JVM虚拟机工具-jstack

  • Jstack是什么?

    • Jstack (Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(-般称为 threaddump 或者 javacore 文件)

    • 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做些什么事情,或者等待着什么资源

  • Jstack怎么做

    • 常用命令jstack -l 3500
    • jstack -F 当正常输出的请求不被响应时,强制输出线程堆栈 Force
    • 经典面试题之 【jstack怎么进行死锁问题定位?】
  • 线上程序一般不能kill进程pid的方式直接关闭

    • shutdownHook :在关闭之前执行的任务

JVM虚拟机工具-jconsole

  • 参考文献

  • 远程连接springboot项目

    • Dockerfile
    	#VERSION 0.0.1
    	#Author: xiaozhang
    
    	 #基础镜像,使用alpine操作系统,openjkd使用8u201
    	FROM openjdk:8-jdk-alpine
    
    	#作者
    	MAINTAINER xiaozhang <754521437@qq.com>
    
    	#系统编码
    	ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="\
    	-Xms800m \
    	-Xmx800m \
    	-XX:+PrintGCDetails \
    	-XX:PermSize=256m \
    	-XX:MaxPermSize=512m \
    	-XX:MaxNewSize=512m \
    	-Dcom.sun.management.jmxremote \
    	-Dcom.sun.management.jmxremote.port=9999 \
    	-Dcom.sun.management.jmxremote.rmi.port=9999 \
    	-Djava.rmi.server.hostname=192.168.0.10 \
    	-Dcom.sun.management.jmxremote.local.only=false \
    	-Dcom.sun.management.jmxremote.authenticate=false \
    	-Dcom.sun.management.jmxremote.ssl=false"
    
    	#声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
    	VOLUME /tmp
    
    	#应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
    	ADD target/eureka-server.jar app.jar
    
    	#启动容器时的进程
    	ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
    
    	#暴露8080端口
    	EXPOSE 8761
    	EXPOSE 9999
    

远程连接说明

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=9999 (远程访问端口)
-Dcom.sun.management.jmxremote.rmi.port=9999 (远程访问端口)
-Djava.rmi.server.hostname=192.168.0.10 (主机外网ip)
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

* 容器启动命令
```	docker run -d \
	-p 8761:8761 -p 9999:9999 \
	--name group_es_web_1 eureka-server:1.0.0
```

JVM虚拟机工具-VisualVM

  • VisualVM是什么?

    • VisualVM是一个集成命令行JDK工具和轻量级分析功能的可视化工具
  • VisualVM怎么用?

    • 在IDEA安装VisualVM插件,File-> Setting-> Plugins -> Browers Repositrories 搜索VisualVM Launcher安装并重启IDEA

    • 配置VisualVM,Ctrl + Alt + S > Other Settings > VisualVM Launcher

      VisualVM executable: E:/Java/jdk1.8.0_131/bin/jvisualvm.exe

JVM虚拟机工具-IBM HeapAnalyzer

官方地址

IBMHeapAnalyzer可以分析heapdump、phd、hax等文件
IBMHeapAnalyzer是一个非常重要的JAVA程序bug分析工具。
它可以帮助我们分析哪些原因可能导致了程序的内存溢出

JVM常见的问题

简介:互联网项目常见JVM问题讲述

  • 为什么访问量大就越容易出问题
    • 判断一个用户是否在白名单 List.contain(用户) true,》Set.contain(用户) 通过hash比较》布隆过滤器
    • 结论==》用户量大和用户量小的项目遇到的问题和解决方案也就不一样
  • 案例1,关于死锁问题
    • 解决方案==》jstack -m命令查看帮我们检测是否有死锁,或者jconsole、jvisualVM也能检查
    • new Thread的时候最好带上名称
  • 案例2,堆内存泄漏问题
    • 现象:出现OOM或者Full GC,heap使用率明显上升,经常达到Xmx
    • Full GC出现的正常频率是大概一天一到两次
    • 解决方案==》jmap dump下内存/heap dump on OOM/heap dump on FullGC+jhat本地分析/mat(eclipse),或者jconsole、jvisualVM也能检查
  • 案例3,堆外内存泄漏

    • 现象:heap使用率很低,但是出现了OOM或者Full GC

    • 解决方案==》可以用btrace跟踪DirectByteBuffer的构造函数来定位

名词-布隆过滤器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Z先生09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值