tomcat temp临时文件不清空,占用硬盘,jdk字体内存走漏 ...

打印 上一主题 下一主题

主题 811|帖子 811|积分 2433

JSP老旧项目迁徙过来的代码,天生海报,会读取图片,读取字体文件,绘制图片,会天生大量临时文件,内存走漏。
方案一,服务器定时删除temp临时文件夹
方案二,图片、字体改用静态类读取文件,并且开释相关资源文件。


导致缘故原由

  1. package com.huida.train.utils;
  2. import org.springframework.core.io.ClassPathResource;
  3. import org.springframework.stereotype.Component;
  4. import javax.imageio.ImageIO;
  5. import java.awt.*;
  6. import java.awt.image.BufferedImage;
  7. import java.io.IOException;
  8. @Component
  9. public class ResourceUtil {
  10.     // 使用volatile保证多线程环境下的可见性,防止指令重排
  11.     private static volatile BufferedImage activityShareBannerImage;
  12.     private static volatile Font sourceHanSansFont;
  13.     private static volatile BufferedImage backgroundImage;
  14.     private static volatile Font rdFont;
  15.     /**
  16.      * 方正小标宋字体
  17.      */
  18.     private static volatile Font fzxbsjwFont;
  19.     /**
  20.      * 方正黑体
  21.      */
  22.     private static volatile Font htFont;
  23.     /**
  24.      * 仿宋
  25.      */
  26.     private static volatile Font fsFont;
  27.     private static volatile BufferedImage bottomTextImg;
  28.     private ResourceUtil() {
  29.         // 私有构造函数,防止外部实例化
  30.     }
  31.     public static BufferedImage getBottomTextImg() {
  32.         if (bottomTextImg == null) {
  33.             synchronized (ResourceUtil.class) {
  34.                 if (bottomTextImg == null) {
  35.                     try {
  36.                         ClassPathResource resource = new ClassPathResource("static/qr/bottomText.png");
  37.                         bottomTextImg = ImageIO.read(resource.getInputStream());
  38.                     } catch (IOException e) {
  39.                         throw new RuntimeException(e);
  40.                     }
  41.                 }
  42.             }
  43.         }
  44.         return bottomTextImg;
  45.     }
  46.     public static Font getFsFont() {
  47.         if (fsFont == null) {
  48.             synchronized (ResourceUtil.class) {
  49.                 if (fsFont == null) {
  50.                     try {
  51.                         ClassPathResource fsFontResource = new ClassPathResource("static/font/fs_gbk.TTF");
  52.                         fsFont = Font.createFont(Font.TRUETYPE_FONT, fsFontResource.getInputStream());
  53.                     } catch (IOException | FontFormatException e) {
  54.                         throw new RuntimeException(e);
  55.                     }
  56.                 }
  57.             }
  58.         }
  59.         return fsFont;
  60.     }
  61.     public static Font getHtFont() {
  62.         if (htFont == null) {
  63.             synchronized (ResourceUtil.class) {
  64.                 if (htFont == null) {
  65.                     try {
  66.                         ClassPathResource fsFontResource = new ClassPathResource("static/font/ht.TTF");
  67.                         htFont = Font.createFont(Font.TRUETYPE_FONT, fsFontResource.getInputStream());
  68.                     } catch (IOException | FontFormatException e) {
  69.                         throw new RuntimeException(e);
  70.                     }
  71.                 }
  72.             }
  73.         }
  74.         return htFont;
  75.     }
  76.     public static Font getFzxbsjwFont() {
  77.         if (fzxbsjwFont == null) {
  78.             synchronized (ResourceUtil.class) {
  79.                 if (fzxbsjwFont == null) {
  80.                     try {
  81.                         ClassPathResource fsFontResource = new ClassPathResource("static/font/FZXBSJW.TTF");
  82.                         fzxbsjwFont = Font.createFont(Font.TRUETYPE_FONT, fsFontResource.getInputStream());
  83.                     } catch (IOException | FontFormatException e) {
  84.                         throw new RuntimeException(e);
  85.                     }
  86.                 }
  87.             }
  88.         }
  89.         return fzxbsjwFont;
  90.     }
  91.     public static Font getSimsunFont() {
  92.         if (rdFont == null) {
  93.             synchronized (ResourceUtil.class) {
  94.                 if (rdFont == null) {
  95.                     try {
  96.                         ClassPathResource fsFontResource = new ClassPathResource("static/font/simsun.ttf");
  97.                         rdFont = Font.createFont(Font.TRUETYPE_FONT, fsFontResource.getInputStream());
  98.                     } catch (IOException | FontFormatException e) {
  99.                         throw new RuntimeException(e);
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.         return rdFont;
  105.     }
  106.     public static BufferedImage getBackgroundImage() {
  107.         if (backgroundImage == null) {
  108.             synchronized (ResourceUtil.class) {
  109.                 if (backgroundImage == null) {
  110.                     try {
  111.                         ClassPathResource resource = new ClassPathResource("static/qr/backgroundImage.png");
  112.                         backgroundImage = ImageIO.read(resource.getInputStream());
  113.                     } catch (IOException e) {
  114.                         throw new RuntimeException(e);
  115.                     }
  116.                 }
  117.             }
  118.         }
  119.         return backgroundImage;
  120.     }
  121.     public static BufferedImage getActivityShareBannerImage() {
  122.         if (activityShareBannerImage == null) {
  123.             synchronized (ResourceUtil.class) {
  124.                 if (activityShareBannerImage == null) {
  125.                     try {
  126.                         ClassPathResource resource = new ClassPathResource("static/qr/activity_share_banner.png");
  127.                         activityShareBannerImage = ImageIO.read(resource.getInputStream());
  128.                     } catch (IOException e) {
  129.                         throw new RuntimeException(e);
  130.                     }
  131.                 }
  132.             }
  133.         }
  134.         return activityShareBannerImage;
  135.     }
  136.     public static Font getSourceHanSansFont() {
  137.         if (sourceHanSansFont == null) {
  138.             synchronized (ResourceUtil.class) {
  139.                 if (sourceHanSansFont == null) {
  140.                     try {
  141.                         ClassPathResource fsFontResource = new ClassPathResource("static/font/SourceHanSans-Regular.otf");
  142.                         sourceHanSansFont = Font.createFont(Font.TRUETYPE_FONT, fsFontResource.getInputStream());
  143.                     } catch (IOException | FontFormatException e) {
  144.                         throw new RuntimeException(e);
  145.                     }
  146.                 }
  147.             }
  148.         }
  149.         return sourceHanSansFont;
  150.     }
  151. }
复制代码
  1. @Override
  2.     public String getStrainingShareCode2(Map<String, String> map) throws IOException, FontFormatException {
  3.         String trainingCourseId = map.get("trainingCourseId");
  4.         TrainingCourse trainingCoursePo = trainingCourseMapper.select(trainingCourseId);
  5.         if (trainingCoursePo == null) {
  6.             throw new TipUserException("活动-培训已被删除或不可见");
  7.         }
  8.         BufferedImage activityShareBannerImage = ResourceUtil.getActivityShareBannerImage();
  9.         // 开启画图
  10.         Graphics2D graphics = activityShareBannerImage.createGraphics();
  11.         //字体样式
  12.         Font font = ResourceUtil.getSourceHanSansFont().deriveFont(Font.BOLD, 27);
  13.         //字体颜色
  14.         float[] color = Color.RGBtoHSB(58, 58, 58, null);
  15.         graphics.setColor(Color.getHSBColor(color[0], color[1], color[2]));
  16.         graphics.setFont(font);
  17.         String address = "";
  18.         //地点
  19.         if (trainingCoursePo.getAddress().length() >= 16) {
  20.             address = trainingCoursePo.getAddress().subSequence(0, 14) + "...";
  21.         } else {
  22.             address = trainingCoursePo.getAddress();
  23.         }
  24.         drawWrapString(graphics, address, 50, 220, activityShareBannerImage.getWidth() - 100, null, null);
  25.         //时间
  26.         drawWrapString(graphics, DateUtils.dateTime(trainingCoursePo.getStartTime()) + " ~ " + DateUtils.dateTime(trainingCoursePo.getEndTime()), 50, 275, activityShareBannerImage.getWidth() - 100, null, null);
  27.         //报名人数
  28.         Long enrollNum = trainingCoursePo.getEnrollNum();
  29.         if (ObjectUtils.isNull(enrollNum)) {
  30.             enrollNum = 0L;
  31.         }
  32.         drawWrapString(graphics, enrollNum.toString() + "人报名", 50, 330, activityShareBannerImage.getWidth() - 100, null, null);
  33. //        String base64 = ImgUtil.toBase64DataUri(activityShareBannerImage, "png");
  34. //        return base64;
  35.         // 指定文件路径
  36.         String filePath = HuiDaConfig.getTrainUploadPath() + "/shareCode/" + trainingCoursePo.getRecordId() + "/" + trainingCoursePo.getRecordId() + "_" + enrollNum + ".png";
  37.         File outputfile = new File(filePath);
  38.         if (!outputfile.exists()) {
  39.             String deleteFilePath = HuiDaConfig.getTrainUploadPath() + "/shareCode/" + trainingCoursePo.getRecordId();
  40.             File deleteFileFile = new File(deleteFilePath);
  41.             FileUtils.deleteDirectory(deleteFileFile);
  42.             File parentDir = outputfile.getParentFile();
  43.             if (!parentDir.exists()) {
  44.                 parentDir.mkdirs();
  45.             }
  46.             ImageIO.write(activityShareBannerImage, "png", outputfile);
  47.         }
  48.         activityShareBannerImage.flush();
  49.         graphics.dispose();
  50.         return filePath;
  51.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表