对于C/C++开发者来说,他们在内存管理方面具有至高的权利,但是也承担着巨大的维护责任。而对于Java程序员来说,有了JVM(Java虚拟机)管理机制的帮助,再也不用担心内存泄漏和内存溢出问题了。因此,这篇文章我将深入探讨一下JVM,它的内部结构以及运行原理。

一、JDK命令行的工具

  • JPS :虚拟机进程状况工具
    -q 只输出LVMID,省略主类的名称
    -m 输出虚拟机进程启动时传递给主类main()函数的参数
    -l 输出主类的全名,如果进程执行的是Jar包,输出Jar路径
    -v 输出虚拟机进程启动JVM参数

  • jstat:虚拟机统计信息监视工具
    可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
    命令格式 jstat [option vmid [interval[s|ms] [count]]]
    如果是远程虚拟机进程 那么VMID格式:[protocol:][//]lvmid[@hostname[:port]/servername]
    参数interval和count代表查询间隔和次数,如果省略了这两个参数,说明只查询一次。

  • jinfo:Java配置信息工具
    jinfo是作用是实时查看和调整虚拟机的各项参数。使用jps -v参数可以查看虚拟机启动时显示执行的参数列表。
    jinfo -flag PretenureSizeThreshold 7832
    -XX:PretenureSizeThreshold=0

  • jmap:Java内存映像工具
    jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。
    -dump 生成Java堆转储快照。
    -finalizerinfo 显示在F-Queue中等待Finalizer线程执行finalize方法的对象。
    -heap 显示Java堆详细信息。
    -histo 显示堆中对象统计信息。
    -permstat 以ClassLoader为统计口径显示永久代内存状态。
    -F 当虚拟机进程对-dump选项没有响应时,可使用这个选项强制生成dump快照。

  • jhat:虚拟机堆转储快照分析工具
    与jmap搭配使用,来分析jmap生成的堆 转储快照。

  • jstack:Java堆栈跟踪工具
    jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或javacore文件)。
    -f 当正常输出的请求不被响应时,强制输出线程堆栈
    -l 除堆栈外,显示锁的附件信息
    -m 如果调用到本地方法的话,可以显示C/C++的堆栈

二、JDK的可视化工具

  • JConsole
    JConsole工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定。双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器。

  • VisualVM
    VisualVM是一个集成多个JDK命令行工具的可视化工具。VisualVM基于NetBeans平台开发,它具备了插件扩展功能的特性,通过插件的扩展,可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat、jstack)等。VisualVM在JDK/bin目录下。

感谢

如果大家想了解更多,欢迎继续阅读接下来的章节,推荐大家熟读《深入理解Java虚拟机》这本书。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐