假设在Intel或AMD机箱上的64位Linux上使用Java 1.6 JVM,创建一个简单的对象会使用多少内存开销(以字节为单位)?例如,二维数组中的每一行都是一个单独的对象.如果我的阵列很大,我将使用多少RAM?
关于内存效率,我有以下问题:
必须将正确的数据类型用于相应的变量.将数值表示1为a byte需要内存的八分之一(但如果我错了,请纠正我).我的问题是,如果在定义变量类型或初始化时发生内存分配/推导?这可能看起来很奇怪,但我要求关于不需要初始化的全局变量,因为它们具有与局部变量相关的默认值.我还想知道对象数据类型是否有默认大小?我认为这是基于JVM(32位对64位)?
我需要存储大量的RGB颜色对象.对于一些常见的用法,这些占我应用总内存的8%到12%.我现在定义如下:
class MyColor {
byte red;
byte green;
byte blue;
}
Run Code Online (Sandbox Code Playgroud)
我假设(大多数)JVM实际上为每个条目使用int.最简单的选择是:
class MyColor {
byte [] color = new byte[3];
private static final int red = 0;
private static final int green = 1;
private static final int blue = 2;
}
Run Code Online (Sandbox Code Playgroud)
将整个数组放在一个int中吗?或者它是一个int [3]的封面?如果是第一个,这很好.如果是第二个,那么最好的是:
class MyColor {
int color;
private static final int red_shift = 0;
private static final int green_shift = 8;
private static final int blue_shift = 16;
}
Run Code Online (Sandbox Code Playgroud)
还是有更好的方法?
更新:我还将有一个getRed(),setRed(int),...作为访问器.我刚刚列出了类的数据组件以使其更小.和大小是关键的问题在这里.代码不会花费大量时间来访问这些值,因此性能不是一个大问题.
更新2:我使用SizeofUtil …
如何有效地确定内存中Date对象的大小?
最初我通过这个链接谈论一个日期对象的9个字节 ..
当我找到这个链接时,我试图找到它,它说的是32字节!!!! 对于内存中的日期对象.
请帮助.
思考这些问题的原因:我正在将数百万个特定类的对象加载到内存中,以进行一些计算.该类中的一个变量是Date对象.我可以将值存储为long,但这需要代码中的小怪癖.我正在考虑尽可能减少内存占用.要做到这一点,我需要知道每种情况下的确切内存要求才能接听电话.
我想开始确定我的refs的内存需求以及它们随应用程序的使用而增长的方式.我怎样才能做到这一点?
我试图检查程序的内存消耗。在检查过程中,我注意到了一些有趣的事情。
我创建了一个 Load 类,其中包含一些字段。
class Load {
String name;
String title;
long id;
}
Run Code Online (Sandbox Code Playgroud)
我创建了 500000 个 Load 对象并将它们添加到 ArrayList。我发现,它占用18 MB了内存。
然后,我修改了 Load 类并使用了referenceLong 类型。
class Load {
String name;
String title;
Long id;
}
Run Code Online (Sandbox Code Playgroud)
再次创建了 500000 个 Load 对象并将它们添加到 ArrayList。有趣的是,这一次它占用的内存比前一次少。它的方式是 14 MB。
运行测试更改操作系统和 JVM 版本。找到以下结果。
OS: Windows 10 Pro 64 bit
JDK: 11 64bit
Object Created | Load Object | Memory | Load Object | Memory
------------------------------------------------------------------------------
1. 500000 | With primitive long | 18 …Run Code Online (Sandbox Code Playgroud) 我们都知道,用Java分配的每个对象都增加了以后的垃圾回收周期的权重,并且Optional<T>对象没有什么不同。我们经常使用这些对象来包装可为空的对象,这将导致代码更安全,但是要花多少钱呢?
是否有人知道可选对象添加了什么样的附加GC压力,而不是简单地返回null,以及这对高通量系统的性能有什么样的影响?
Integer()有多大?我问因为下面发生的事情.
在尝试将10 ^ 6个整数(在[0,10 ^ 6)中)放入双端队列后,我的堆内存耗尽.该实现使用双向链表并显示为
Deque<Item> implements Iterable<Item> { }
Run Code Online (Sandbox Code Playgroud)
但是当使用Strings时,我能够完成而无需增加堆的大小:
String hw = "Hello, world.";
for (i=0;i<10**6;i++) {
myDq.addToEnd(hw);
}
Run Code Online (Sandbox Code Playgroud) 我试图找出有效的数据类型.我知道int是4个字节,char是一个字节.
我对吗?你觉得哪一个更好?