当前位置:首页 > 开发 > 编程语言 > Java > 正文

JAVA应用 文件删除后空间不释放问题查找

发表于: 2013-11-06   作者:dingjun1   来源:转载   浏览次数:
摘要: 问题:有一个JAVA应用会频繁地创建文件,完成业务逻辑后会删除该文件,但是发现磁盘已使用空间一直在增长。 1、查看标记为删除,但是未释放空间的文件(root账号) root# lsof | grep deleted java      27870    mq  253u  &nb
问题:有一个JAVA应用会频繁地创建文件,完成业务逻辑后会删除该文件,但是发现磁盘已使用空间一直在增长。

1、查看标记为删除,但是未释放空间的文件(root账号)
root# lsof | grep deleted
java      27870    mq  253u      REG                8,3    33556584    4325563 /***/db-4970.log (deleted)
java      27870    mq  254u      REG                8,3    33558799    4325567 /***/db-4972.log (deleted)
java      27870    mq  255u      REG                8,3    33557564    4325551  /***/db-4969.log (deleted)
java      27870    mq  256u      REG                8,3    33558446    4325565  /***/db-4971.log (deleted)
java      27870    mq  257u      REG                8,3    33554898    4325569 /***/db-4973.log (deleted)
java      27870    mq  258u      REG                8,3    33554976    4325571 /***/db-4974.log (deleted)
....

发现JAVA进程27870对这些标记为删除的文件有引用

2、根据业务大致知道这些文件在那几个地方被使用,查看jvm heap中的实例数,确认这一点。

>$./jmap -histo:live 27870 > ~/27870.txt

间隔一段时间多次输出,发现与文件对象相关实例一直在增加:
第一次:
70:           179           5728  java.io.RandomAccessFile
  71:           233           5592  java.io.FileDescriptor
---------------------------------------------------------------
第二次:
  66:           204           6528  java.io.RandomAccessFile
  69:           259           6216  java.io.FileDescriptor
-------------------------------------------------------------------
第三次:
  64:           220           7040  java.io.RandomAccessFile
  68:           267           6408  java.io.FileDescriptor
-------------------------------------------------------------------
3、输出 jvm heap,分析java.io.RandomAccessFile被那些对象引用
>$jmap -dump:live,format=b,file=~/27870.dump 27870

4、使用jhat进行分析
>$jdk1.6/bin/jhat ~/27870.dump
Reading from /home/web/27870.dump
Dump file created Wed Nov 06 11:16:53 CST 2013
Snapshot read, resolving...
Resolving 123572 objects...
Chasing references, expect 24 dots........................
Eliminating duplicate references........................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

5、打开浏览器http://localhost:7000
点击页面下面的链接
Show heap histogram

然后查找RandomAccessFile,点开对应的链接。
通过References (summary) by Type 中对应的信息,一层一层往上找,直到找到对应的业务类,这样就大致可以定位到在哪个类中有引用了,再分析业务代码找到引用没有释放的地方。


JAVA应用 文件删除后空间不释放问题查找

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1、错误现象 运维的监控系统发来通知,报告一台服务器空间满了,登陆服务器查看,根分区确实没有空
SQL> set linesize 200 SQL> select segment_name, sum(bytes / 1024 / 1024/1024) from dba_
清理SQL Server日志释放文件空间的终极方法 【问题场景】有一个数据库,它的名字叫CNBlogsText,日
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\
UNDO表空间下的数据文件被误删除后的处理方法: 操作前备份数据库,以避免更大的损失。 思路: 1、
公司新项目上线,需要从老数据库中定时同步部分数据到新数据库中,写了一个调度程序来做。 运行一段
【问题场景】有一个数据库,它的名字叫CNBlogsText,日志文件霸占了23G硬盘空间,而事务日志已经截
先说下为什么要删除main方法,由于部分同事在本地写了main方法测试代码,提交代码时候忘记把main方
上午写的那篇去除Main方法由于本人考虑欠缺,以为一个Java类里面只有一个Main方法,没有考虑到被注
java文件查找 java文件查找的实现,简单易学,这是查找界面以及主函数代码: package 大二lesson04;
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号