当前位置: 首页 > 科技观察

JVM的秘密花园

时间:2023-03-12 10:52:39 科技观察

在软件运行或者程序开发中,有时候需要写一些临时文件,那么写这些临时文件的目录在哪里呢?不同的软件、不同的语言、不同的操作系统都有不同的区别。在Java语言的世界里,因为是跨平台的语言,每个人的设置都不一样,这里对应的就是当前系统的临时文件所在的位置,在代码中可以获取到环境变量。System.getProperty("java.io.tmpdir")看看。这个目录除了可以作为临时目录使用外,我们不写文件的时候不也用不到吗?其实并不是。这个目录相当于JVM的“秘密花园”,里面记录了虚拟机的很多信息。比如每个java进程都会在临时目录下的`hsperfdata_$USER(你自己的用户名)`目录下生成一个进程ID对应的文件。有人可能会遇到这种问题,Java程序可以正常执行,但是通过jps命令无法列出进程。这个一般和tmpdir有关,直接查看是否有对应的写权限,磁盘是否已满。以后无论是执行jps命令还是附加其他监控诊断应用到JVM上,如果需要提供Java进程列表,都从这里读取。而且这个流程文件不是空文件,里面的内容很多。所以我们常用的jstat和我们之前文章中提到的JConsole、JVisualVM、SA等工具都会从这个文件中读取内容,然后显示出来。文件内容从何而来?为了支持JVM的监控,在虚拟机中专门开辟了一块内存来存放这些性能统计相关的数据,统称为PerfData,这也是之前目录被称为hsperfdata的原因。随着Java进程的不断运行和那些不断变化的监控值,虚拟机一般通过共享内存将内存映射到这个文件。并在数据变化时刷新到文件中。比如我们可以使用命令查看加载类的信息,以及gcjstat-classfile:////hsperfdata/jstat-gcfile:////hsperfdata/不够好玩,可以试试这个命令查看更多监控信息关闭它可以通过-XX:-UsePerData来操作,JVM官方对该参数的描述如下-XX:+UsePerfData启用perfdata特性。默认情况下启用此选项以允许JVM监视和性能测试。禁用它会抑制hsperfdata_userid目录的创建。要禁用perfdata功能,请指定-XX:-UsePerfData。这个文件是我们通过外部监控工具附加到JVM时读取的。这个秘密空间通过PerfMemory模块在JVM内部统一管理,负责创建、分配和销毁。一般情况下,JVM退出时会同步删除该文件,但如果非正常杀掉,则该文件会一直保留,永远保留。下次再执行哪怕是jps这样简单的命令,只要启动了java进程,就会判断该目录下的文件对应的进程是否存在,如果不存在,则将其删除。本文转载自微信公众号“Tomcat物语”,可关注下方二维码。转载此文请联系Tomcat那些东西公众号。