V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Fangs123
V2EX  ›  Java

Spring Boot 启动后为什么还会读取磁盘上的 jar, 还有为什么一个 jar 为什么会被读取多遍? 跪求大佬解答

  •  
  •   Fangs123 · 2021-01-04 17:36:03 +08:00 · 2180 次点击
    这是一个创建于 1209 天前的主题,其中的信息可能已经有所发展或是发生改变。

    根据 java 的 pid, 使用 pstree -p 命令, 得到共有 78 个相关线程.

    然后使用 lsof 查看对应程序打开的句柄情况, 发现 jar 包或者目录有多条记录, 例如: spring-webmvc-5.0.5.RELEASE.jar 这个 jar 包就有 153 条, 并且有一半不是 mem, 而是文件标识符

    另外 lsof -p 和 lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more 统计的结果有什么不同?? lsof -p 统计出句柄是一千多, 后面脚本统计出来是七万多....

    5 条回复    2021-01-04 23:54:58 +08:00
    qwerthhusn
        1
    qwerthhusn  
       2021-01-04 17:42:50 +08:00
    我理解这些 jar 包应该不会一下子全部加载到内存里面去,不然这起一下几百兆没了

    应该是读取个索引,后面需要加载类的时候再去一次次读取,
    php8
        2
    php8  
       2021-01-04 17:43:45 +08:00 via Android
    class 是 lazy load 的,首次使用时读入内存,然后不会再读。getResourceAsStream 获取的资源是不做 cache 的,每次使用都从 jar 文件里读。
    Fangs123
        3
    Fangs123  
    OP
       2021-01-04 18:05:57 +08:00
    @php8 可是也不应该调用这么多次的 getResourceAsStream 啊, 并且不是几个 jar 包, 是许多 jar 包都有这种情况
    php8
        4
    php8  
       2021-01-04 21:44:49 +08:00 via Android   ❤️ 1
    @Fangs123 classloader 首次读取 jar 的时候已经打开了,关闭 classloader 的时候才会关闭 jar 文件
    zoharSoul
        5
    zoharSoul  
       2021-01-04 23:54:58 +08:00
    Java 句柄是什么意思?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2775 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:10 · PVG 18:10 · LAX 03:10 · JFK 06:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.