我们怎样才能找出java对象的大小?
例:
class Person{
String name;
int age;
public Person(String n, int a){
name = n;
age = a;
}
}
Person person = new Person("Andy", 30);
Run Code Online (Sandbox Code Playgroud)
现在怎样才能知道人物对象的大小?
谢谢
众所周知,java使用以下数据类型
byte Occupy 8 bits in memory
short Occupy 16 bits in memory
int Occupy 32 bits in memory
long Occupy 64 bits in memory
Run Code Online (Sandbox Code Playgroud)
如果我创建一个类似的
class Demo{
byte b;
int i;
long l;
}
Demo obj = new Demo();
Run Code Online (Sandbox Code Playgroud)
现在的问题是obj大小< or > or =尺寸b+i+l是104 bytes.请以正当理由给我澄清.
谢谢,
Anil Kumar C.
我想知道缓存中正在使用多少字节.这在确定合理的尺寸方面很有用.有什么好方法可以计算Google Guava缓存中使用的字节数?
该stats方法没有给出我想要的东西; 它不包括缓存中字节数的度量标准.
这种asMap方法是我迄今为止发现的最佳方法.获得此信息后,可以使用In Java中显示的一些技术,确定对象大小的最佳方法是什么?.但是,坦率地说,这些看起来相当痛苦,至少从Clojure代码库来看.为了避免一些依赖,我目前正在使用Nippy,一个Clojure序列化库的粗略快捷方式:(count (nippy/freeze (.asMap cache))).我正在寻找更好的方法.
我正在使用Clojure代码库中的Google Guava缓存,但我的问题不一定是Clojure特有的; 在大多数情况下,Java互操作相对容易.
更新:回应下面的评论的一些背景.首先,我想知道我是否忽略了Google Guava缓存API的有用部分.其次,我不知道我链接的通用方法(用于计算堆上的内存使用情况)是否适用于Guava.更广泛地说,查找缓存大小利用率是一个重要的用例,所以我有点惊讶它没有更好的在线记录.
嗨,我正在学习Java基础知识.我需要检查原始数据类型的大小,比如sizeof();在c语言中使用.
示例代码:
int i;
System.out.print(sizeof(i));
Run Code Online (Sandbox Code Playgroud) 已发布的SQS消息的大小有限制.单条消息不能大于256 KB,一批消息(最多10条)也不能超过256 KB.将消息添加到集合以便稍后发布到SQS队列时,如何跟踪消息大小以确保我的请求保持在限制之下?
我已经研究了获取对象大小的方法,并且我知道在调用之后我可以使用失败消息的ID sendMessageBatch().我不认为这些都是非常好的解决方案,因为对象本身的大小省略了消息的开销数据(我认为也很重要),我真的不想仅仅因为管理失败的消息批次太大了.我真的不希望我的消息那么大,但你永远不知道.
要批量处理和发送的代码段:
List<SendMessageBatchRequestEntry> entries = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)
然后循环:
SendMessageBatchRequestEntry entry = new SendMessageBatchRequestEntry();
entry.setMessageBody(gson.toJson(message));
entry.setMessageAttributes(attributes);
entry.setId(messageId);
// How to make sure `entry` is not larger than 256 KB, and how to
// make sure adding this entry won't cause the batch to exeed 256 KB?
entries.add(entry);
Run Code Online (Sandbox Code Playgroud)
最后:
client.sendMessageBatch(queueUrl, entries);
Run Code Online (Sandbox Code Playgroud) 在计算对象数组的内存大小时,下面的代码按预期给出"使用过的24个字节",据我所知,它包括:
4bytes(element pointer)+16bytes(object header)+4bytes(element space) = 24bytes
// with JVM argument -XX:-UseTLAB
public static void main(String[] args) {
long size = memoryUsed();
Object[] o = new Object[]{1};
//Object[] o = new Object[]{1L};
size = memoryUsed() - size;
System.out.printf("used %,d bytes%n", size);
//Output: used 24 bytes
}
public static long memoryUsed() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
Run Code Online (Sandbox Code Playgroud)
但是当元素类型改为Long(1L)时,结果令人困惑,大部分时间它都是"使用了9,264字节",任何人都可以帮助启发我吗?这两种元素类型之间的内存分配有什么不同?
// with JVM argument -XX:-UseTLAB
public static void main(String[] args) {
long size = memoryUsed();
//Object[] o = new …Run Code Online (Sandbox Code Playgroud) 背景:我正在编写一些通过网络序列化和反序列化二进制协议的代码,并且我正在编写 C#、Swift 和 Java 客户端代码。
我们从网络上获取一个数据包(字节数组),将其反序列化为结构树,然后遍历树查找内容。
在 C# 中,我使用了Span<T>结构体,它为您提供了现有内存缓冲区的“视图”。同样在 Swift 中,我使用了也可以充当“视图”的Data结构。在 C++ 中我可能会使用一些类似的概念。
本质上是这样的:
原始缓冲区:R_T1aaa_T2bbb_T3ccc.
解析为Root -> [Tag1[aaa],Tag2[bbb], Tag3[ccc]]
在上面的模型中,Root、Tag1、Tag2、Tag3 对象是在堆栈上分配的结构体。标记内容(aaa、bbb、ccc)只是指向底层原始缓冲区的指针,我们根本没有为它们分配或复制任何堆内存。
在 Java 中,我首先创建一个这样的类(@MarkRotteveel 善意地指出我可以使用 ByteBuffer 而不是创建自己的包装类):
class ByteArrayView {
@NonNull final byte[] owner; // shared
final int offset;
final int length;
}
Run Code Online (Sandbox Code Playgroud)
我打算继续使用与 C#、Swift 中使用的相同模式,但是我想到了——我使用数组视图来避免堆分配,但是Java 中的所有内容都是堆分配。我分配对象,而不是byte[]在该位置复制一些值ByteArrayView,但它仍然是堆分配。
我知道,如果我有大的“切片”,那么像我的ByteArrayView或这样的东西java.nio.ByteBuffer会减少我的程序分配的内存总量,但在大多数情况下,我的标签很小 - 例如 4 字节、12 字节、32 字节。
byte[]如果小对象仍然在堆上,那么用包装对象交换小对象是否有任何有意义的结果?它真的会让事情变得更糟吗,因为在我们到达我们想要读取的实际字节之前有一个额外的间接寻址?额外的代码复杂性值得吗?
经验丰富的 Java 开发人员会在这里做什么?
可能重复:
在Java中,确定对象大小的最佳方法是什么?
如果我们在类中创建实例变量和实例方法,那么如何找出为该类的每个Object分配的总内存,如下所示,例如,我认为它是一些变量(a,b)大小和方法区域大小(显示).这是真的吗?怎么样写在一个类里面的主要方法区域.
例如:
class A {
int a;
float b;
void display()
{
---
}
public static void main(String a[])
{
A obj=new A();
}
}
Run Code Online (Sandbox Code Playgroud) java字符串数组占用多少空间?更具体地说,字符串数组看起来像这样的空间(以字节为单位):
Longbowman
kingdom
lord
weapon1,weapon2,weapon3
armor1,armor2,armor3
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我要创建一个包含5,000多个这些数组的程序,并想知道它将占用多少空间,所以我知道是否应该重做数据存储.
那么回顾一下,字符串数组(如果可量化的话)占用了多少空间?
当使用jol的GraphLayout类打印从对象实例引用的对象的图时,某些输出条目会说“(其他)”,而不是类型和引用路径。例如,考虑以下代码,该代码显示20个随机Integer对象的列表的图形:
List<Integer> foo = new Random().ints(20).boxed().collect(Collectors.toList());
System.out.println(GraphLayout.parseInstance(foo).toPrintable());
Run Code Online (Sandbox Code Playgroud)
此代码打印:
java.util.ArrayList object externals:
ADDRESS SIZE TYPE PATH VALUE
d642ecc8 24 java.util.ArrayList (object)
d642ece0 16 java.lang.Integer .elementData[0] 212716192
d642ecf0 56 (something else) (somewhere else) (something else)
d642ed28 16 java.lang.Integer .elementData[1] 1503736768
d642ed38 16 java.lang.Integer .elementData[2] -2099759732
d642ed48 16 java.lang.Integer .elementData[3] 445566433
d642ed58 16 java.lang.Integer .elementData[4] -1528625708
d642ed68 16 java.lang.Integer .elementData[5] -555424299
d642ed78 16 java.lang.Integer .elementData[6] 1607595284
d642ed88 16 java.lang.Integer .elementData[7] 763466772
d642ed98 16 java.lang.Integer .elementData[8] 638331919
d642eda8 16 java.lang.Integer .elementData[9] -1742026575
d642edb8 16 …Run Code Online (Sandbox Code Playgroud) java ×10
arrays ×2
allocation ×1
amazon-sqs ×1
clojure ×1
data-storage ×1
guava ×1
jol ×1
object ×1
oop ×1
sizeof ×1