出于什么设计原因,java中没有sizeof运算符?知道它在c ++和c#中非常有用,如果需要你如何获得某种类型的大小?
我想知道静态成员变量通常是如何在C++等语言中实现的,如果它们的使用会影响实例化对象的大小.
我知道静态成员由该类的所有实例共享,但它是如何共享的?如果它影响对象大小,那么有10个静态变量会增加大于1的大小吗?
我问,因为我可以想到它可以实现的两种方式:
有没有人知道Exception在创建和抛出后会占用多少内存?
例如,NullPointerException.
以及垃圾收集的例外情况如何?
我正在计算java对象[hashmap]的大小[使用的内存].它包含[在运行时]不同数据类型的元素,因此[no-of-elem*size-of-element]并不是一种好方法.现在的代码是通过一系列的
if (x)
do something
else if (primitives)
lookup size and calculate
Run Code Online (Sandbox Code Playgroud)
然而,这个过程是CPU占用并且效率低下.
我正在考虑采用以下两种方法:
我正在寻找任何人使用这些方法的性能,效率,缩放等经验,或者如果你知道更好的方法.
PS:这是我正在构建的后台实用程序,因此大小不需要超级准确,尽管它应该是正确的.因此,我愿意以准确性换取性能
我对深度大小不感兴趣[不会计算此对象引用的对象的大小.]
我正在寻找性能比较和理解getObjectSize()如何在内部工作..所以我不会搞砸别的东西来提高性能
谢谢
我想知道检索java对象大小的任何简单方法吗?另外,无论如何要在c ++中获得像sizeof运算符这样的类的大小?
我正在尝试开发一个javaagent,它可以在asm-4的帮助下编写代码.现在我遇到了一个非常基本的问题,javaagent的类加载器没有看到asm依赖,因此失败了.我是否必须提供一个jar-with-dependencies(又名maven build plugin),它包含代理所需的所有类,或者是否有另一种方法将类添加到java代理?直接在类路径中引用jar asm-all.jar没有帮助.构建jar-with-dependencies最初没有帮助,因为无法使用程序集插件设置Premain-Class属性.感谢帮助;-)
根据这个问题,确定Java中对象的内存大小的标准方法是使用java.lang.instrumentation.经过一些研究,看起来没有Scala特定的方法来实现这一点,因此Java方法也应该适用于此.
不幸的是,对于没有Java背景的Scala程序员来说,在Scala中调整这种技术并不完全是直截了当的.我的问题是:
问题1
到底发生了什么?我想我们必须将类ObjectSizeFetcher放在一个单独的JAR中的原因是为了确保它在我们想要使用它的实际程序之前以某种方式加载.我假设没有Premain-Class条目和参数就不可能使用仪器-javaagent:TheJarContainingObjectFetcher.jar?
问题2
有没有一种简单的方法来实现SBT中的完整工作流程?目前我只看到一个有点麻烦的解决方案:我首先必须设置一个辅助SBT项目,我在其中定义ObjectSizeFetcher并将其打包到JAR中.到目前为止,我还没有弄清楚如何Premain-Class在打包过程中自动将条目添加到JAR,所以我必须手动解决.我可以将生成的JAR添加到我想要使用的项目的本地库中getObjectSize.对于这个项目,我现在必须启用fork in run和使用javaOptions in run += "-javaagent:TheJarContainingObjectFetcher.jar".是否有更简单(且侵扰性更小)的工作流程来快速使用现有SBT项目中的仪器?也许我可以直接告诉SBT有关Premain-Class使这个辅助JAR不必要吗?
问题3
您是否会建议使用完全不同的方法来评估Scala中对象的内存使用情况?
我想估计一个物体占用的大小.为了获得对象的大小,我可以使用
为此我可以使用Instrumentation.getObjectSize(myObject),但这会给我一个"浅"的尺寸.我想获得Object的大小,包括它引用的对象的大小.
我的想法是我需要获取对象的大小,然后遍历所有非静态或基元的对象字段,并获取它们指向的对象的大小并递归地执行此操作.
当然,我不想计算对象大小几次,或者陷入循环,所以我必须记住我们已经计算过的大小的对象.
是否有更快或更标准的方法来做到这一点?
我的代码看起来像这样:
public static long getObjectSize(Object obj)
{
return getObjectSize(obj, new HashSet<Object>());
}
private static long getObjectSize(Object obj, Set<Object> encountered)
{
if (encountered.contains(obj))
{
// if this object was already counted - don't count it again
return 0;
}
else
{
// remember to not count this object's size again
encountered.add(obj);
}
java.lang.reflect.Field fields[] = obj.getClass().getFields();
long size = Instrumentation.getObjectSize(obj);
// itereate through all fields
for (Field field : fields)
{
Class fieldType = …Run Code Online (Sandbox Code Playgroud) 在java中声明一个数组时,我们必须使用new关键字动态分配内存.
class array
{
public static void main(String ars[]) {
int A[] = new int[10];
System.out.println(A.length);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码将创建一个包含10个元素的1D数组,每个元素4个字节.并且输出将是10.但是,当您运行以下相同的代码时:
class array {
public static void main(String ars[]) {
int A[] = new int[0];
System.out.println(A.length);
}
}
Run Code Online (Sandbox Code Playgroud)
输出是0.我想知道你写的new int[0]时候Java是否为数组分配了一些内存?如果是多少钱?
最后一天,我接受了一次采访,他们问我java问题,其中一些问题我不知道答案.我很想知道这个问题的答案.采访者没有告诉我答案.我在这里问这个问题:
想知道上述问题的答案,以便下次可以帮助我.
只需简单的答案,我们就会非常感谢对规范的说明,注释和/或相关链接 - 以及学习这些东西的好方法是什么?