Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lambda表达式的Java堆转储分析_Java_Lambda_Profiling_Java 8_Heap Dump - Fatal编程技术网

lambda表达式的Java堆转储分析

lambda表达式的Java堆转储分析,java,lambda,profiling,java-8,heap-dump,Java,Lambda,Profiling,Java 8,Heap Dump,我的Java应用程序堆转储显示,我的类中使用的特定lambda已经锁定了一些内存,并且在GC期间没有释放它 Heap将特定的匿名lambda类显示为父类$$lambda$ID,在当前情况下,ID为79(附图像)。这个ID似乎与类中存在的lambda的数量没有任何关系,因此我们无法得出表示哪个lambda的结论。我有兴趣指出确切的lambda表达式,因为它有助于分析、修复和测试相关场景 用DJ反编译类文件没有帮助,因为它将lambda表达式重新创建为可读代码。如果对此有任何想法,请告诉我 尝试定义

我的Java应用程序堆转储显示,我的类中使用的特定lambda已经锁定了一些内存,并且在GC期间没有释放它

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

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


尝试定义系统属性

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

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

如果lambda表达式分配了大量内存,则其中必须包含捕获的值。因此,检查实例可能会引导您了解实际的lambda表达式。此外,您可以分析分配以找到源…@Holger我需要在这里更精确。该类有多个lambda,用于类似类型的不同目的。我将用简单的术语来描述——比如说我有getAccountName、getAccountBalance、getAccountNameName等方法——假设每个方法都在不同的服务器上调用web服务,并且响应将返回给其他方法进行处理,而不保留状态。这里的问题是其中一个服务占用了无限的时间,并且服务和我的应用程序都没有超时,这使得“DefaultHttpClient”(line)保持为活动对象。因此,无法识别哪个lambda。除了查看其属性(捕获的值和参数)的形式外,您还可以查看传入的引用,即保存在lambda上的内容。这通常就足够找到它了。如果探查器有分配记录,您也可以使用它,它将为您提供带有lambda已分配的行号的调用站点。@Pavan Kumar:这是一种奇怪的方法,因为JVisualVM可以直接收集堆转储。它的分析器还能够跟踪分配站点。当您没有真正使用现有的工具时,不要要求使用其他工具。除此之外,没有多少文档可供使用,尽管可能不是跨JDK的解决方案。我会尝试一下,让你知道。好的解决方案,希望一些通用的(不特定于jvm)以类似的方式存在。@Pavan Kumar:因为这些类的存在都是特定于jvm的,所以不能选择转储它们,而不是特定于jvm的…我似乎不知道如何运行javap。它不想在我给它的课堂上运行。说。错误:找不到类: