• java.util.jar.JarFile cause native heap memory leak


    最近项目中使用了JarFile 这个类 来load jar包中的 configuration,大致的情况如下

    public void processJarEntries(JarFile paramJarFile, ZipEntryFilter paramZipEntryFilter, ZipEntryProcessor paramZipEntryProcessor)
      {
        for (Enumeration localEnumeration = paramJarFile.entries(); localEnumeration.hasMoreElements(); ) {
          ZipEntry localZipEntry = (ZipEntry)localEnumeration.nextElement();
          if (paramZipEntryFilter.accept(localZipEntry))
            paramZipEntryProcessor.process(paramJarFile, localZipEntry);
        }
      }


    ZipEntryFilter 是过滤jar文件中不相关的文件 ZipEntryProcessor 用来做具体对找到的文件操作


    问题引入: 此时会通过JarFile中的 两个method 来 遍历jar包中的文件 hasMoreElements & nextElment

    在多线程处理的情况下引起 native heap memory leak 可以 通过  pmap -ax pid|grep heap 来查看


    解决:

    JarInputStream localJarInputStream = null;

    localJarInputStream = new JarInputStream(getBufferedInputStream(paramFile));

    public static InputStream getBufferedInputStream(File paramFile) throws IOException {
        FileInputStream localFileInputStream = new FileInputStream(paramFile);
        return new BufferedInputStream(localFileInputStream);
      }

    public void processJarEntries(JarInputStream paramJarInputStream, JarEntryProcessor paramJarEntryProcessor) {
        ZipEntry localZipEntry = paramJarInputStream.getNextEntry();
        while (localZipEntry != null) {
          paramJarEntryProcessor.process(localZipEntry);
          localZipEntry = paramJarInputStream.getNextEntry();
        }
        paramJarEntryProcessor.completeProcess();
      }

    此bug可以在oracle官网中查到




  • 相关阅读:
    conda使用
    onedrive共享文件的下载
    生物信息软件安装(不定时更新)
    if 的常见问题解析
    C语言常见的误区
    流程控制
    C语言中的运算符
    scanf的具体用法
    代码的规范
    printf中的x%及用法
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3225966.html
Copyright © 2020-2023  润新知