Tag: 内存消耗

Java和对象,数组和基元类型的精确引用大小

我想知道对象在内存中分配的真实空间。 我尝试用一​​些例子来解释:使用64位JVM,指针大小应该是8个字节,所以: Object singletest = new Object(); 将占用8个字节来引用Object加上Object的大小 Object arraytest = new Object[10]; 将需要8个字节来引用存储数组的位置加上8 * 10个字节来存储数组加上每个Object的大小 int singleint = new int; 将只占用2个字节,因为int是基本类型 int[] arrayint = new int[10]; 将占用8个字节来引用位置,并使用10 * 2个字节作为元素 而且,这就是为什么Java允许编写这样的代码的原因: int[][] doublearray = new int[2][]; int[0][] = new int[5]; int[1][] = new int[10]; 真正发生的是数组会像对象一样产生一个引用(也就是指针),所以在声明时它并不重要第二维的大小(维度可能不同,它们之间没有链接)。 然后所采用的空间将是:对doublearray (8字节)的引用,第一维只是对第二维的引用,所以其他8字节* 2(第一维尺寸),最后是2字节* 5加2字节* 10 。 所以,最后,如果有一个像这样的真正的类: class Test { […]

衡量Java程序内存使用情况的最佳方法是什么?

我目前正在使用VisualVM ,但我遇到的问题是我无法保存它生成的图形。 我需要报告一些有关其内存使用情况和运行时间的数据,尽管使用System.nanoTime()很容易获得运行时间。 我也尝试过NetBeans探测器,但它不是我想要的,因为我不是在寻找会减慢速度的特定部件,所以这样就太过分了。 最大的问题是它占用了太多的处理时间。 另外,不要让我像VisualVM一样轻松捕获/传输数据,至少就我所知。 理想情况下,最好的方法是调用一些方法,因为我可以更容易地获取信息,但是像VisualVM这样的任何实际上让我保存图形的东西都可以。 与NetBeans分析器相比,VisualVM的性能也相当不错,但我认为这是因为我没有使用它的分析器。 我目前正在使用Ubuntu,但Windows 7很好。 我宁愿有一个专门做这个的程序,因为那些没有的程序得到的信息可能包括JVM和其他更好的东西。 好吧,显然,您可以保存当前会话的快照并最大化VisualVM中的窗口,这样您就可以使图表更大,拍摄快照并剪切它们……但这就是一种黑客行为。 更好的建议欢迎。

在对象上调用getter而不是将其存储为局部变量(内存占用,性能)

在下面的代码中,我们调用listType.getDescription()两次: for (ListType listType: this.listTypeManager.getSelectableListTypes()) { if (listType.getDescription() != null) { children.add(new SelectItem( listType.getId() , listType.getDescription())); } } 我倾向于重构代码以使用单个变量: for (ListType listType: this.listTypeManager.getSelectableListTypes()) { String description = listType.getDescription(); if (description != null) { children.add(new SelectItem(listType.getId() ,description)); } } 我的理解是JVM以某种方式针对原始代码进行了优化,尤其是嵌套调用,如children.add(new SelectItem(listType.getId(), listType.getDescription())); 。 比较两个选项,哪一个是首选方法,为什么? 这就是内存占用,性能,可读性/易用性以及其他我现在不想到的内容。 后一个代码片段何时变得比前者更有利,也就是说,当使用临时局部变量变得更合适时,是否有任何(近似)数量的listType.getDescription()调用,因为listType.getDescription()总是需要一些堆栈存储this对象的操作?