【第二章:Java核心技术解析】第13节:Java进阶 - JVM内存机制(下)


大家好,在前面两个小节中,我们主要讲述了JVM内存机制的基础知识点,垃圾回收算法和垃圾收集器的工作方式等。本小节在前面的基础上进一步介绍JVM内存调优相关命令,这些命令对于我们排查线上故障相当有帮助。本节中还会介绍Java中的类加载机制相关技术知识点,希望大家可以有效理解与掌握。

(1)JVM常用内存调优命令:(重点掌握)

答: JVM在内存调优方面,提供了几个常用的命令,分别为jps,jinfo,jstack,jmap以及jstat命令。分别介绍如下:

  • jps:主要用来输出JVM中运行的进程状态信息,一般使用jps命令来查看进程的状态信息,包括JVM启动参数等。
  • jinfo:主要用来观察进程运行环境参数等信息。
  • jstack:主要用来查看某个Java进程内的线程堆栈信息。jstack pid 可以看到当前进程中各个线程的状态信息,包括其持有的锁和等待的锁。
  • jmap:用来查看堆内存使用状况。jmap -heap pid可以看到当前进程的堆信息和使用的GC收集器,包括年轻代和老年代的大小分配等
  • jstat:进行实时命令行的监控,包括堆信息以及实时GC信息等。可以使用jstat -gcutil pid1000来每隔一秒来查看当前的GC信息。

这些常见的命令均为JDK提供,在这个如下的位置,各位可以自行查看。

图片说明


解析:

上述命令都属于JVM提供的内存查看并且调优的常用命令,每一个命令都是极其重要的,需要大家学习与熟练掌握,对于日常开发工作有很大帮助。接下来,我们对每一个命令都给出对应的示例展示吧。

jps 用于显示当前所有java进程pid,jps经常使用的参数如下:

-q:仅输出VM标识符,不包括class name,jar name,arguments in main method 
-m:输出main method的参数 
-l:输出完全的包名,应用主类名,jar的完全路径名 
-v:输出jvm参数 

示例如下:

图片说明

jinfo 可以观察进程运行环境参数,通过jinfo pid可以查看指定进程的运行环境参数,如下所示:

图片说明

很遗憾,有错误发生,这个错误是指我们使用JDK版本和当前进程启动时候使用的JDK版本不一致。接着查看java -version 如下所示:

图片说明

再来接着看我们进程121559所使用的java版本:

图片说明

所以,我们需要使用同样版本的JDK才可以查看该进程运行时的环境参数,如下所示:

图片说明

jstack 用于显示jvm中当前所有线程的运行情况和线程当前状态,一般使用的参数为-l,表示长列表,并且打印锁的相关附加信息。jstack的输出中还可以看到每一个线程当前所处的状态以及其当前所占用的锁和等待的锁,还可以检测是否存在死锁。如下所示:

图片说明

jmap 用来打印内存映射以及查看堆内存细节等,一般情况下使用-heap参数来 打印堆内存的概要信息,GC使用的算法以及堆的一些配置等信息,如下所示:

图片说明

jstat 一般用来观察GC情况,并且进行实时的分析与监控,可以使用的参数如下:

-class 显示ClassLoad的相关信息
-compiler 显示JIT编译的相关信息
-gc 显示和gc相关的堆信息
-gccapacity 显示各个代的容量以及使用情况
-gcmetacapacity 显示metaspace的大小
-gcnew 显示新生代信息
-gcnewcapacity 显示新生代大小和使用情况
-gcold 显示老年代和永久代的信息
-gcoldcapacity 显示老年代的大小
-gcutil   显示垃圾收集信息
-gccause 显示垃圾回收的相关信息(通-gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因
-printcompilation

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java开发岗高频面试题全解析 文章被收录于专栏

<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论
笔记: java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。实例对象就通过Class对象来创建的。 有三种获得Class对象的方式: Class.forName(“类的全限定名”) 实例对象.getClass() 类名.class (类字面常量)
3 回复 分享
发布于 2020-06-23 10:30
不好意思打扰了,有关类加载的缓存机制,请问所谓的缓存区是哪里呢?是堆内存吗?被缓存的类和加载结束后在堆内存创建的Class对象指的是一个东西吗?
1 回复 分享
发布于 2020-06-24 10:45
类加载这里错了,加载来的Class对象存放到方法区中,不会在堆中创建。详见深入理解Java虚拟机P215最下面。书内有详细说明
1 回复 分享
发布于 2020-03-11 13:48
打卡 一刷。
点赞 回复 分享
发布于 2020-09-10 16:11
二刷打卡
点赞 回复 分享
发布于 2020-08-20 20:53
作者你好,字符串常量池不是在 JDK7 被拿到 Java 堆中了吗? 在 JDK8 将方法区剩余部分(类型数据和运行时常量池)移到了称为"元数据区"的本地内存中.
点赞 回复 分享
发布于 2020-08-05 17:16
打卡
点赞 回复 分享
发布于 2020-01-18 21:37
打卡
点赞 回复 分享
发布于 2020-01-03 20:33
类加载机制这块不太懂
点赞 回复 分享
发布于 2020-01-01 16:33

相关推荐

挣K存W养DOG:我记得好多人说这个公司就是白嫖方案的,现在有大体方案要让你给他展示实现细节了,也是无敌了
点赞 评论 收藏
分享
no_work_no_life:深圳,充电宝,盲猜anker
点赞 评论 收藏
分享
评论
5
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务