`
dingjun1
  • 浏览: 211834 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
问题:有一个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 中对应的信息,一层一层往上找,直到找到对应的业务类,这样就大致可以定位到在哪个类中有引用了,再分析业务代码找到引用没有释放的地方。


0
0
分享到:
评论

相关推荐

    操作系统课程设计模拟文件系统Java

    文件删除需要释放文件占用的簇,并在FAT表中将其标记为可用。 此外,我们还需要考虑文件系统的其他功能,例如目录管理。这可能涉及到创建目录结构,通过目录项来存储文件名和对应的文件对象。我们还需要实现查找...

    操作系统课设--文件管理项目.zip

    操作系统课设中的“文件管理项目”是一个以Java GUI技术实现的实践任务,旨在让学生深入理解并应用操作系统中关于文件管理的基本原理。这个项目的核心目标是模拟一个简单的文件系统,允许用户进行基本的文件操作,...

    DuplicateFilesFinder:用于查找重复文件的 Java 应用程序(最适用于 *.mp3 文件),用户将能够删除重复文件

    总的来说,DuplicateFilesFinder作为一个Java实现的重复文件查找器,为用户提供了一种高效、跨平台的方式来管理他们的文件库,特别是对于音乐爱好者来说,可以帮助他们整理庞大的音乐收藏,释放存储空间,同时保持...

    Java API函数大全

    `CreateFileMapping` 创建一个新的文件映射对象,用于将文件或部分文件映射到进程的地址空间。这对于实现内存映射文件非常有用,可以大大提高文件读写的速度。 **1.7 DeleteFile** `DeleteFile` 用于删除指定的...

    超级有影响力霸气的Java面试题大全文档

    内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的...

    Java经典问题答案(带书签)

    Java是一种广泛使用的面向对象的编程语言,具有跨平台、面向对象、分布式、解释执行、鲁棒性、安全性、...以上仅是文件内容中涉及的Java知识点的简要总结,实际使用时需要结合具体的编程环境和上下文深入理解和应用。

    DiskLruCache磁盘缓存java源码

    - **数据一致性**:由于磁盘缓存的异步特性,可能存在的数据不一致问题需要开发者在使用过程中特别关注。 总结来说,DiskLruCache是Android开发中实现高效磁盘缓存的一种有效工具,通过理解其工作原理和源码,可以...

    java必记单词

    - **应用场景**:自动释放不再使用的对象占用的内存空间。 #### Generalization 一般化,泛化 - **定义**:泛化是类之间的继承关系。 - **应用场景**:通过继承机制实现代码复用。 #### Graphics User Interface ...

    《Java面试手册》.pdf

    - 内存管理主要涉及垃圾收集(Garbage Collection),Java自动进行内存回收,释放不再使用的对象所占用的空间。开发者可以通过System.gc()请求垃圾收集,但不保证立即执行。 7. Java集合框架 - 集合框架是Java中...

    操作系统磁盘空间管理

    在传统的连续分配方式中,当文件大小变化或文件被删除时,会导致大量分散的空闲空间,增加了后续文件存储的难度。为了解决这个问题,成组链接技术将磁盘空间划分为一系列固定大小的块,然后将这些块链接在一起形成一...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    Java 内存分析工具

    Java内存分析工具是Java开发过程中不可或缺的调试利器,...通过熟练使用MAT,开发者可以有效地管理和优化Java应用程序的内存使用,提升程序的稳定性和效率。记住,及时检测和处理内存泄漏是保持应用健康运行的关键。

    JAVA面试重点话术(张大大吐血整理).doc

    【JAVA面试重点话术】 在Java面试中,面试官常常关注一些核心概念和技术,包括SpringMVC的工作原理、内存管理的堆和栈、锁机制以及常见的数据存储解决方案,如Redis和分布式服务框架Dubbo及Zookeeper。以下是这些...

    java私塾学习笔记整理

    2. **垃圾回收**:自动管理内存,释放不再使用的对象所占用的内存空间。 3. **代码安全**:通过类加载器、字节码验证和安全管理者等机制确保代码的安全性。 #### 第二章:基础语法 **一、关键字** Java中有53个...

    你必须知道的261个JAVA语言问题

    Java语言是全球最广泛使用的编程语言之一,尤其在企业级应用和互联网开发中占据着重要地位。《你必须知道的261个JAVA语言问题》这本书涵盖了Java编程中遇到的各种常见问题,旨在帮助开发者深入理解Java的核心概念,...

    java课程详细讲解(针对初学者)

    - **文件操作**:Java提供了File类和其他相关类用于读写文件,实现文件的创建、删除、移动等操作。 4. **集合框架** - **数组列表ArrayList和链接列表LinkedList**:两者都是存储和管理对象的容器,但实现方式...

    文件存储数据

    外部存储适合存储大文件,如多媒体内容,但不保证在应用卸载后仍然存在。 ### 存储路径 Android提供了便捷的方法获取存储路径: - **内部存储路径**:`getFilesDir()` 返回内部存储的应用特定目录;`getCacheDir()...

Global site tag (gtag.js) - Google Analytics