在软件运行或者程序开发中,有时候需要写一些临时文件,那么写这些临时文件的目录在哪里呢?不同的软件、不同的语言、不同的操作系统都有不同的区别。在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:///
