根据 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 统计出句柄是一千多, 后面脚本统计出来是七万多....
1
qwerthhusn 2021-01-04 17:42:50 +08:00
我理解这些 jar 包应该不会一下子全部加载到内存里面去,不然这起一下几百兆没了
应该是读取个索引,后面需要加载类的时候再去一次次读取, |
2
php8 2021-01-04 17:43:45 +08:00 via Android
class 是 lazy load 的,首次使用时读入内存,然后不会再读。getResourceAsStream 获取的资源是不做 cache 的,每次使用都从 jar 文件里读。
|
3
Fangs123 OP @php8 可是也不应该调用这么多次的 getResourceAsStream 啊, 并且不是几个 jar 包, 是许多 jar 包都有这种情况
|
4
php8 2021-01-04 21:44:49 +08:00 via Android 1
@Fangs123 classloader 首次读取 jar 的时候已经打开了,关闭 classloader 的时候才会关闭 jar 文件
|
5
zoharSoul 2021-01-04 23:54:58 +08:00
Java 句柄是什么意思?
|