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

2021-01-04 17:36:03 +08:00
 Fangs123

根据 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 统计出句柄是一千多, 后面脚本统计出来是七万多....

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

应该是读取个索引,后面需要加载类的时候再去一次次读取,
php8
2021-01-04 17:43:45 +08:00
class 是 lazy load 的,首次使用时读入内存,然后不会再读。getResourceAsStream 获取的资源是不做 cache 的,每次使用都从 jar 文件里读。
Fangs123
2021-01-04 18:05:57 +08:00
@php8 可是也不应该调用这么多次的 getResourceAsStream 啊, 并且不是几个 jar 包, 是许多 jar 包都有这种情况
php8
2021-01-04 21:44:49 +08:00
@Fangs123 classloader 首次读取 jar 的时候已经打开了,关闭 classloader 的时候才会关闭 jar 文件
zoharSoul
2021-01-04 23:54:58 +08:00
Java 句柄是什么意思?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/741601

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX