一次自定义字体文件读取导致硬盘容量暴增的问题解决

5 篇文章 0 订阅
2 篇文章 0 订阅

【背景】证书生成功能,因为需要调用大量java流处理操作和图片处理,需要占用大量的内存和io消耗,当并发量高时,容易造成容器OOM kill,因此将证书生成抽离成单独的定时任务前置预生成,避免瞬时大量即时生成对服务器造成的压力

             

【问题】经过一段时间的生成服务后发现 , 服务器硬盘的容量占比不断升高,其中linux 系统下的tmp文件夹不断扩大,一个月达到几十G的容量暴增

               linux下tmp文件夹属于系统的临时文件夹,程序或者系统产生的临时文件将会暂时存储在该文件夹,对该文件夹文件内容进行分析 

              命令  du -sh *    ,发现在该文件夹下存在大量 +~JFXXXXXXXXXXXX.tmp 格式的文件,导致容器内存不断暴增

              

【分析一】分析该文件的产生来源,发现在证书生成环节中,需要获取自定义字体文件 msyh.ttc  , 将会以inputStream流的方式从resources目录进行读取

                  

                  其中获取自定义Font类,JDK8提供了两个方法来进行读取自定义字体文件

                  ①:以inputStream流的形式进行读取

                        

                 ②:以File文件的形式进行读取

                        

                通过试验发现,将程序打成War包的形式运行时,通过两种方式均能正确获取到自定义字体文件,但是将程序打成Jar包运行时,只能使用流的形式进行读取。

【分析二】因为程序是以springboot打包成jar的方式进行部署,因此采用了以流的形式进行字体文件读取,进一步分析JDK源码 

                  

                  发现JDK在以流的形式进行读取文件时,会先在tmp目录下创建一个临时文件,将resources下的文件通过字节读取写入到该file文件,因此硬盘容量暴增的原因应该是在获取自定义字体文件时不断产生临时文件造成的。

                  那么该临时文件的清除策略是怎样的呢?

                  ①:linux系统自动清除策略,tmp下文件如果在30天内没有进行读写操作,将会自动清除

                  ②:java程序停止或者容器重启时,会自动清除该临时文件

 

【解决】通过对程序代码进行分析发现,每次获取的自定义字体文件其实都是相同的,但是每次生成证书时都需要重新进行读取,大大增加了IO的消耗,同时也产生了非常多的临时文件,导致硬盘容量暴增

              解决方案一:是否可以生成后自动清除临时文件,通过进一步分析JDK源码发现,在临时文件tmp目录下将不会执行主动清除策略

                                   

             解决方案二:既然每次都读取的文件时同一个,能否在类加载的时候就进行读取呢,只加载一次,保存在内存中,后续都使用该文件即可

                                   有想法了开始改造代码,将获取字体文件的方法写入到static{  }  方法块,当类被加载时,会自动加载字体文件,且后续都使用该字体文件进行证书证书生成

                                  

 

【结果】改造完代码,run一下,看下结果,发现这样执行多次也只会有一个临时文件生成,因为只加载一次字体文件,问题解决,容器硬盘终于不会暴增啦,可以开开心心预生成

              

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值