軟件運行或者程序開發中,有時候會須要寫一些臨時文件,那寫這些臨時文件的目錄在哪呢?不一樣的軟件,不一樣的語言,以及不一樣的操做系統都有所區別。在 Java 語言的世界裏,由於是跨平臺的語言,並且每一個人的設置並不相同,因此這對應到具體當前系統的臨時文件在哪,能夠經過在代碼裏獲取環境變量
java
System.getProperty("java.io.tmpdir") 來看。tomcat
這個目錄除了咱們能夠作爲臨時目錄外,是否是咱們不寫文件的時候就用不到了呢? 微信
其實並非。這個目錄至關於 JVM 的「祕密花園」,虛擬機會在這裏記錄許多的信息。工具
例如每個 java 的進程,都會在該臨時目錄下的 `hsperfdata_$USER(你本身的用戶名)`目錄生成一個進程ID對應的文件。性能
可能有人遇到這種問題,Java 程序能夠正常執行,可是經過 jps 命令不能把進程給列出來。這種通常都是和 tmpdir 有關,直接查看是否有對應的寫權限,磁盤是否已滿。
url
之後你不管是執行jps 命令,仍是其餘監控診斷類的應用須要 attach 到JVM 的時候,若是須要提供Java 進程列表,都會從這兒讀取。並且這個進程文件並非個空文件,裏面有大量的內容。spa
因此咱們經常使用的 jstat 以及咱們之前文章中提到的JConsole、JVisualVM、SA 等工具,都會從這個文件這裏讀內容,再進行展現。
操作系統
文件的內容哪裏來的呢?.net
這了支持對 JVM 的監控,虛擬機裏特意開闢了一塊內存,用來存放這些性能統計相關的數據,統稱爲 PerfData,這也是前面目錄稱爲 hsperfdata的緣由。隨着 Java 進程的不斷運行,那些不斷變化的監控值,虛擬機通常會經過共享內存的方式將內存與這個文件進行映射。並在數據變化的時候刷新到文件。3d
好比咱們能夠經過命令來查看加載類的信息,以及像gc 的一些數據
jstat -class file:///<path>/hsperfdata/<pid>
jstat -gc file:///<path>/hsperfdata/<pid>
還不過癮,能夠試試這個命令,查看更多的監控信息
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 thehsperfdata_userid
directories. To disable theperfdata
feature, specify-XX:-UsePerfData
.
這個文件就是咱們經過外部監控工具 attach 到 JVM 的時候,讀到的那些內容。
這個祕密空間,在 JVM 內部是經過 PerfMemory 的模塊來統一管理的,負責建立、分配和銷燬。
正常狀況下JVM 退出時會把該文件同步刪除,但若是異常kill 的狀況,那文件會保留下來,一直留着。下次執行哪怕一個簡單的 jps 等命令時,只要啓動了 java 進程,都會判斷下該目錄下文件對應的進程是否存在,沒有就會刪除了。
相關閱讀
Java七武器系列長生劍 -- Java虛擬機的顯微鏡 Serviceability Agent
更多常見問題,請關注公衆號,在菜單「常見問題」中查看,也歡迎加我微信,一塊兒交流。
源碼|實戰|成長|職場
這裏是「Tomcat那些事兒」
請留下你的足跡
咱們一塊兒「終身成長」
本文分享自微信公衆號 - Tomcat那些事兒(tomcat0000)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。