阵列构造的断点

时间:2012-09-14 10:23:30

标签: java eclipse breakpoints yourkit

无论如何在eclipse或其他调试器中设置断点使得执行在构造数组时停止了吗?我对构造一个原始数组(int [])特别感兴趣,但这个问题同样适用于任何数组。

我需要找到造成大量垃圾的罪魁祸首,其中包括int [],char []和byte []等等,所以如果我能在某些条件下设置断点,我将能够缩小代码下来。

我尝试使用你的内存分析,但它只显示这些对象中很小一部分的分配,其余部分显示为<objects without allocation information>,我不知道为什么。当我进入Objects unreachable from GC roots视图时,我只看到大约7%垃圾的分配信息。通过分配这么小比例的对象,我甚至不确定我是否遗漏了一些位置。有没有办法让YK保留所有分配?

3 个答案:

答案 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()打印这些数组,这将打印数组中的所有元素