JVM 的秘密花园

开发 后端
在 Java 语言的世界里,因为是跨平台的语言,而且每个人的设置并不相同,所以这对应到具体当前系统的临时文件在哪,可以通过在代码里获取环境变量。

[[330708]]

软件运行或者程序开发中,有时候会需要写一些临时文件,那写这些临时文件的目录在哪呢?不同的软件,不同的语言,以及不同的操作系统都有所区别。在 Java 语言的世界里,因为是跨平台的语言,而且每个人的设置并不相同,所以这对应到具体当前系统的临时文件在哪,可以通过在代码里获取环境变量。

System.getProperty("java.io.tmpdir") 来看。

这个目录除了我们可以做为临时目录外,是不是我们不写文件的时候就用不到了呢?

其实并不是。这个目录相当于 JVM 的「秘密花园」,虚拟机会在这里记录许多的信息。

例如每一个 java 的进程,都会在该临时目录下的 `hsperfdata_$USER(你自己的用户名)`目录生成一个进程ID对应的文件。

可能有人遇到这种问题,Java 程序可以正常执行,但是通过 jps 命令不能把进程给列出来。这种一般都是和 tmpdir 有关,直接查看是否有对应的写权限,磁盘是否已满。

以后你无论是执行jps 命令,还是其他监控诊断类的应用需要 attach 到JVM 的时候,如果需要提供Java 进程列表,都会从这儿读取。而且这个进程文件并不是个空文件,里面有大量的内容。

所以我们常用的 jstat 以及我们以前文章中提到的JConsole、JVisualVM、SA 等工具,都会从这个文件这里读内容,再进行展示。

文件的内容哪里来的呢?

这了支持对 JVM 的监控,虚拟机里特地开辟了一块内存,用来存放这些性能统计相关的数据,统称为 PerfData,这也是前面目录称为 hsperfdata的原因。随着 Java 进程的不断运行,那些不断变化的监控值,虚拟机一般会通过共享内存的方式将内存与这个文件进行映射。并在数据变化的时候刷新到文件。

比如我们可以通过命令来查看加载类的信息,以及像gc 的一些数据

  1. jstat -class file:///<path>/hsperfdata/<pid> 
  2. jstat -gc file:///<path>/hsperfdata/<pid> 

还不过瘾,可以试试这个命令,查看更多的监控信息

  1. jstat -J-Djstat.showUnsupported=true -snap  pid 

选项默认是开启的,对性能的影响基本可以忽略,如果想要关闭,可以通过-XX:-UsePerData 来操作,

这个JVM参数官方说明如下

-XX:+UsePerfData

  • Enables the perfdata feature. This option is enabled by default to allow JVM monitoring and performance testing. Disabling it suppresses the creation of the hsperfdata_userid directories. To disable the perfdata feature, specify -XX:-UsePerfData.

这个文件就是我们通过外部监控工具 attach 到 JVM 的时候,读到的那些内容。

这个秘密空间,在 JVM 内部是通过 PerfMemory 的模块来统一管理的,负责创建、分配和销毁。

正常情况下JVM 退出时会把该文件同步删除,但如果异常kill 的情况,那文件会保留下来,一直留着。下次执行哪怕一个简单的 jps 等命令时,只要启动了 java 进程,都会判断下该目录下文件对应的进程是否存在,没有就会删除了。

本文转载自微信公众号「 Tomcat那些事儿」,可以通过以下二维码关注。转载本文请联系 Tomcat那些事儿公众号。

 

责任编辑:武晓燕 来源: Tomcat那些事儿
相关推荐

2024-09-02 09:06:34

2012-05-03 10:43:26

iOS

2024-07-15 08:37:16

2024-03-14 09:00:00

2013-07-09 17:18:52

LAMP架构网站建设

2009-08-27 08:50:17

2018-10-18 12:42:24

2020-08-21 13:33:01

区块链计算机系统

2017-05-16 09:56:44

2023-07-31 07:25:27

2021-08-11 22:18:43

Socket函数监听

2019-12-05 12:11:37

DevOps开发应用程序

2020-04-15 13:55:28

Kubernetes容器

2020-09-15 12:57:46

C 语言浮点数内存

2011-08-29 09:59:26

2013-11-27 11:04:05

震网病毒震网Stuxnet

2009-08-21 19:01:13

Windows 7番茄花园

2010-12-27 21:08:13

惠普南无科贸

2012-04-24 23:33:10

iOS

2022-03-29 10:32:32

SpringBoot@Enable
点赞
收藏

51CTO技术栈公众号