我最近在一些代码中遇到过这种情况 - 基本上有人试图创建一个大对象,当没有足够的堆来创建它时应对:
try {
// try to perform an operation using a huge in-memory array
byte[] massiveArray = new byte[BIG_NUMBER];
} catch (OutOfMemoryError oome) {
// perform the operation in some slower but less
// memory intensive way...
}
Run Code Online (Sandbox Code Playgroud)
这似乎不对,因为Sun自己建议您不要尝试捕获Error或其子类.我们讨论过它,另一个想法是显式检查空闲堆:
if (Runtime.getRuntime().freeMemory() > SOME_MEMORY) {
// quick memory-intensive approach
} else {
// slower, less demanding approach
}
Run Code Online (Sandbox Code Playgroud)
同样,这似乎并不令人满意 - 特别是因为选择一个值SOME_MEMORY很难轻易地与相关工作相关:对于某些任意大型对象,我如何估计其实例化可能需要多少内存?
有没有更好的方法呢?它甚至可以在Java中使用,还是在语言本身的抽象级别之下管理内存?
编辑1:在第一个例子中,估计byte[]给定长度的内存量可能实际上是可行的,但是有一种更通用的方法可以扩展到任意大对象吗?
编辑2:正如@erickson指出的那样,有一些方法可以在创建对象后估计对象的大小,但是(忽略基于先前对象大小的统计方法)是否有办法对尚未创建的对象执行此操作?
似乎还有一些争论是否合理OutOfMemoryError- 有人知道任何结论吗?
我有一个ArrayList<Obj>,我想知道它使用了多少内存.
这Obj是变体,因此,并不像根据对象的大小乘以数组中的元素数量那么容易.
最后一天,我接受了一次采访,他们问我java问题,其中一些问题我不知道答案.我很想知道这个问题的答案.采访者没有告诉我答案.我在这里问这个问题:
想知道上述问题的答案,以便下次可以帮助我.
只需简单的答案,我们就会非常感谢对规范的说明,注释和/或相关链接 - 以及学习这些东西的好方法是什么?
我正在研究java,我记得在某个地方读过java对象,在JVM中有一些开销,这是由虚拟机用于管理的原因.所以我的问题是,有人可以告诉我是否以及如何在HotSpot JVM中获取对象的总大小,以及它可能带来的任何开销?
有没有办法找出scala中对象占用的内存/大小?预先感谢您回复我。
我们使用FusionReactor来显示服务器级别的整体内存使用情况,但是能够查看应用程序范围中存储的单个项目占用多少内存将非常有用.
我有一个查询返回大约600万行,这太大了,无法在内存中同时处理所有行.
每个查询都返回一个Tuple3 [String,Int,java.sql.Timestamp].我知道字符串绝不会超过20个字符,UTF8.
我如何计算出这些元组之一的最大大小,更一般地说,我如何估计这样的scala数据结构的大小?
我正在使用的机器上有6Gb.但是,使用scala-query从scala的列表中读取数据.
我使用-Xmx256M运行此测试以确定我可以在堆上创建的最大对象大小
for (int m = 128;; m++) {
try {
byte[] a = new byte[m * 1024 * 1024];
} catch (OutOfMemoryError e) {
System.out.println(m + "M");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
并获得171M.有没有办法计算这个尺寸?
众所周知,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.