gpt4 book ai didi

java 进程创建处于删除状态的 tmp/tmp* 文件,但增加了 Linux VM 中的磁盘利用率

转载 作者:太空宇宙 更新时间:2023-11-04 05:09:08 28 4
gpt4 key购买 nike

我有一个java spring boot应用程序,它实现了多线程,其中一个线程订阅ZMQ,四个并行线程根据一些预定的时间间隔对接收到的数据执行一些处理。当 jar 在 Linux VM 上运行并使用命令检查打开的文件时

lsof -s -p<pid>

它显示了一个“tmp/tmp* ...(已删除)”类型的文件,其磁盘利用率呈指数增长,并且进程树显示该文件属于正在运行的java进程。此问题仅在 Linux 虚拟机环境中出现,在 Linux 主机上不会出现。

应用程序代码不存在任何此类文件在未关闭的情况下被删除的情况。下面是使用文件处理的代码片段:

File file = null;
PrintWriter printWriter = null;
BufferedReader br = null;
FileReader fileReader = null;
FileWriter fileTruncateObject = null;
try {
file = new File(filePath);
printWriter = new PrintWriter(file);
for (T obj : list) {

String jsonString = writeJsonString(obj);
if ((jsonString.getBytes().length + file.length()) < 123) {
printWriter.write(jsonString);
printWriter.flush();

}

if ((jsonString.getBytes().length + file.length() >= 123) {
printWriter.close();
fileReader = new FileReader(file);
br = new BufferedReader(fileReader);
String data = br.readLine();
// do something with data
br.close();
fileReader.close();
// file reading successfull, now truncating the file and opening new printwriter object!
fileTruncateObject = new FileWriter(file, true);
fileTruncateObject.close();
printWriter = new PrintWriter(file);
}

}
} finally {
if (printWriter != null) {
printWriter.close();
}
if (br != null) {
try {
br.close();
} catch (IOException e) {

}
}
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {

}
}
if (file.exists()) {
try {
if (file.delete()) {
//
}
} catch (Exception e) {
}
}
}

此外,该应用程序还使用 TimeBasedRollingPolicy,最大大小为 10 MB,最大历史记录为 15 天,具有以下属性:

logging.pattern.console= %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
logging.pattern.file= %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
logging.level.com.*=DEBUG
logging.path=logs
logging.file=${logging.path}//a.%d.log
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
logging.file.max-size=10MB
logging.file.max-history=15

我无法读取文件的内容,因为它处于删除阶段。此外,它还针对“2u”文件描述符。可能在写入 /tmp 文件的过程中发生了一些错误,但我如何知道这些错误是什么以及这些错误背后的原因是什么?有什么办法可以避免创建此 /tmp 文件,或者有什么方法可以读取此文件的内容吗?

最佳答案

用于在 Linux VM 中运行 java 进程的命令涉及 stdout 的“nohup”和“tee”。有问题的/tmp/中的输出取决于进程接收的数据(相当大),因此日志开始打印在/tmp/以及属性文件中配置的日志目录上。只需重定向 java 进程的 stdout 和 stderr 即可解决该问题。

正确命令示例:

nohup java jar <jar name> 2>&1 > dev/null &

关于java 进程创建处于删除状态的 tmp/tmp* 文件,但增加了 Linux VM 中的磁盘利用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57770611/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com