项目中有很多文件删除的代码写的很奇怪。

while(!file.delete())Thread.sleep(1000);

还有

System.gc();
file.delete();

这个System.gc()导致频繁fgc影响服务性能了。

最终在网上找到说法是因为在windows系统下jdk无法释放已缓存的文件,这是jdk的一个bug

Bug ID: JDK-4715154 (fs) Cannot delete file if memory mapped with FileChannel.map (windows)

里面有两个例子可以测试下,的确不调用System.gc()无法删除文件,所以windows下面要调用System.gc()。那个while循环是怎么回事呢, 他是等jvm内存不足的时候自己触发gc然后释放文件。但是在linux环境下没这个问题,linux环境下就不用调用System.gc()。

import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;class TestMemoryMapping {public static void main(String[] args) {try {File f = File.createTempFile("Test", null);f.deleteOnExit();RandomAccessFile raf = new RandomAccessFile(f, "rw");raf.setLength(1024);FileChannel channel = raf.getChannel();MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);channel.close();raf.close();buffer = null;// Calling System.gc sometimes works.// System.gc();if (f.delete())System.out.println("Temporary file deleted: " + f);else {System.out.println("Not yet deleted: " + f);}} catch (IOException ex) {ex.printStackTrace();}}
}

gc日志查看

  • -XX:+PrintGC 输出GC日志

    -XX:+PrintGCDetails 输出GC的详细日志

    -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)

    -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)

    -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

    -Xloggc:../logs/gc.log 日志文件的输出路径

    日志说明:5.617(时间戳): [GC(Young GC) 5.617(时间戳): [ParNew(使用ParNew作为年轻代的垃圾回收期): 43296K(年轻代垃圾回收前的大小)->7006K(年轻代垃圾回收以后的大小)(47808K)(年轻代的总大小), 0.0136826 secs(回收时间)] 44992K(堆区垃圾回收前的大小)->8702K(堆区垃圾回收后的大小)(252608K)(堆区总大小), 0.0137904 secs(回收时间)] [Times: user=0.03(Young GC用户耗时) sys=0.00(Young GC系统耗时), real=0.02 secs(Young GC实际耗时)]

    • ->前的是GC前堆内存使用量
    • ->后面是GC后堆内存使用量
    • 括号内是堆内存总量
    • Times: user表示用户态CPU耗时
    • sys表示系统CPU耗时
    • real表示GC实际耗时

    jinfo动态开关

    • 开启gc日志

      • jinfo -flag +PrintGCDetails pid
      • jinfo -flag +PrintGCDateStamps pid
    • 关闭gc日志
      • jinfo -flag -PrintGCDetails pid
      • jinfo -flag -PrintGCDateStamps pid

参考:

Bug ID: JDK-4715154 (fs) Cannot delete file if memory mapped with FileChannel.map (windows)

JDK的bug导致Java文件删除不了,必须fgc相关推荐

  1. 我的程序跑了60多小时,就是为了让你看一眼JDK的BUG导致的内存泄漏。

    从一个BUG说起 前段时间翻到了一个 JDK 有点意思的 BUG,带大家一起瞅瞅. https://bugs.java.com/bugdatabase/view_bug.do?bug_id=81371 ...

  2. 我的程序跑了 60 多小时,就是为了让你看一眼 JDK 的 BUG 导致的内存泄漏

    来源 | why技术 荒腔走板 大家好,我是 why,老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 上面图片中这个正在奔跑的少年,是正在参加校运会的我,那一年我 18 岁,高三. 参加 ...

  3. Java文件删除操作File#delete()

    这个算是一个非常通用并且常见的API了,但是其实这个方法在删除文件的时候其实是有一些限制的.如下,我们可以看见这个API返回值代表着删除是否成功: public boolean delete() {S ...

  4. 案例解读:Oracle目录由于TFA触发bug导致jdb文件未自动清理引起空间不足

    墨墨导读:本文来自墨天轮用户 刘宗宝 投稿,记录一次由于TFA的jdb文件无限积累造成大量空间被占用,导致数据库目录使用率比较高的问题. 墨天轮主页:https://www.modb.pro/u/63 ...

  5. 不小心把java文件删除了_如何使用Java恢复已删除的文件?

    小编典典 要恢复已删除的文件,需要了解底层文件系统的实现方式,因此您需要做一些阅读工作,然后才能到达任何地方. 从理论上讲,是的,您绝对可以使用纯Java来做到这一点.您只需要了解如何绕过文件系统从原 ...

  6. java 文件删除不了File类的delete方法删不掉文件的原因分析

    File directory = null;String path = tempPath + File.separator + fileName;directory = new File(path); ...

  7. java文件删除不了的坑,特别是压缩文件

    我们在用java删除文件的时候通常直接调用file.delete():方法就行了,但是很多情况下却删除不了,下面列举一些情况: 1.是文件夹且不为空,这个没什么好说的,可以先删除文件夹里的文件再删除这 ...

  8. java文件不能转class_安了jdk 却不能将.java文件转换成.class 文件,一运行就说‘javac’不是内部或外部指令,却能运行.class文...

    你没有设置环境变量,,,,,,,,, 安装,配置j2sdk: 执行j2sdk安装程序,自定义路径,我们的安装路径为:C:\j2sdk1.4.2_04(设置的时候要替换成你自己的安装路径) 配置j2sd ...

  9. 关于java文件删除file.delete()无法删除文件的处理办法

    1.问题: file.delete()无法删除文件file.delete()无法删除文件,无论执行多少次结果都为false: 2.分析原因: 1).有可能有流对该文件进行操作,或者是流操作完没有进行关 ...

最新文章

  1. 数据可视化 | Seaborn
  2. springmvc三十二:spring mvc的运行流程
  3. Vh和Vw的简介和使用
  4. Java编写程序将数据存入Kafka中
  5. android-tv
  6. Linux 命令(70)—— size 命令
  7. python集合的元素可以是_Python - 集合与元素之集合定义和基本操作方法
  8. [WP8.1UI控件编程]SemanticZoom控件实现分组列表
  9. php scrscriptipt,xss跨站脚本攻击 (初级-中级-高级)
  10. Python实现微信自动抠图换底助手
  11. makefile 指定文件搜索路径和文件生成路径
  12. 【已解决】瞎设置代理服务器后IE浏览器上不了网
  13. slice与splice用法
  14. AEM CV100 多功能线缆测试仪可以做什么?
  15. 基于epoll实现的c++聊天室(全代码)
  16. 什么是数据分类分级?
  17. 视频编解码(SPS重要参数)
  18. 分析波形信号解决开发板串口连PC后无输出或输出乱码的问题
  19. 需要新应用打开此steam_Steam 圣诞节促销活动——谷节日活动:节日市场
  20. Android Wear 进阶 - 4 发送和同步数据 Sending and Syncing Data

热门文章

  1. 【招聘内推】推荐策略产品经理-阿里文娱优酷产品直招
  2. 双榜首!华为云擎天架构刷新进化计算大赛新纪录!
  3. apt-get update命令卡在waiting for headers
  4. PyTorch 深度学习:32分钟快速入门——DenseNet
  5. 通俗易懂!视觉slam第九部分——光流(Optical Flow)
  6. android+程序崩溃,Android平台程序崩溃的类型及原因列举
  7. 运输层课后第61题解读
  8. 吴恩达《机器学习》第十四章:降维
  9. 怎么调出全局搜索_局部静态变量只能初始化一次?它是怎么实现的
  10. c语言找两个数中的最大值,不用任何比较判断找出两个数中的最大值