无论如何在eclipse或其他调试器中设置断点使得执行在构造数组时停止了吗?我对构造一个原始数组(int [])特别感兴趣,但这个问题同样适用于任何数组。
我需要找到造成大量垃圾的罪魁祸首,其中包括int [],char []和byte []等等,所以如果我能在某些条件下设置断点,我将能够缩小代码下来。
我尝试使用你的内存分析,但它只显示这些对象中很小一部分的分配,其余部分显示为<objects without allocation information>
,我不知道为什么。当我进入Objects unreachable from GC roots
视图时,我只看到大约7%垃圾的分配信息。通过分配这么小比例的对象,我甚至不确定我是否遗漏了一些位置。有没有办法让YK保留所有分配?
答案 0 :(得分:3)
构造数组时,VM只会为参考中填充预留足够的内存空间。这是单步原生操作,并且内存分配过程中的断点将无法实现。例如,请使用以下代码
public class Test{
public void createArray(){
int[] iarray = new int[10];
}
}
现在,如果你反汇编这个,你会得到以下一套说明
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public void createArray();
Code:
0: bipush 10
2: newarray int
4: astore_1
5: return
}
注意方法createArray()
的定义,newarray int
是将内存分配给指定数量的元素的单个指令。
答案 1 :(得分:2)
我为YourKit工作,所以我会尝试澄清“没有分配信息的对象”消息。
默认情况下,YourKit探查器记录每个第10个对象的分配。这是一个可配置的选项,因此将“Record each”值更改为1应该会有所帮助。以下是分析器文档http://www.yourkit.com/docs/11/help/allocations.jsp
的详细信息答案 2 :(得分:0)
World of Primitive arrays is really mysterious and I don't think anyone is allowed in there ;).
在调试中浏览Java代码的唯一方法是F5
,但F5 i.e.Step in
仅适用于未声明的函数,所以我想这是不可能的。
确保您可以使用Arrays.toString()
打印这些数组,这将打印数组中的所有元素