Java lambda 表达式的堆转储分析

Java heap dump analysis for lambda expressions

我的 Java 应用程序堆转储显示我的 class 中使用的特定 lambda 已锁定一定量的内存,并且在 GC 期间未被释放。

Heap 将特定的匿名 lambda class 显示为 ParentClass$$Lambda$ID,在当前情况下,ID 为 79(附图片)。这个 ID 似乎与 class 中存在的 lambda 的数量没有任何关系,因此我们无法断定代表了哪个 lambda。我有兴趣指出确切的 lambda 表达式,因为它有助于分析、修复和测试相关场景。

使用 DJ 反编译 class 文件没有帮助,因为它将 lambda 表达式重新创建为可读代码。如果对此有任何想法,请告诉我。

尝试定义系统属性

jdk.internal.lambda.dumpProxyClasses=/path/to/dir

调用 JVM 时。这将导致运行时将动态生成的 lambda 类 写入磁盘,您可以在其中使用 javap 检查它们。这将使您能够查看它们包含哪些字段(捕获的变量),以及 lambda 对应的 lambda body 方法。