我想知道java HashMap与ArrayList相比的内存开销是多少?
更新:
我想提高搜索大包(600万+)相同对象的特定值的速度.
因此,我正在考虑使用一个或多个HashMap而不是使用ArrayList.但我想知道HashMap的开销是多少.
据我所知,密钥不是存储的,只是密钥的散列,所以它应该像对象的散列大小+一个指针.
但是使用了什么哈希函数?它是Object提供的还是另一个?
在这篇博客文章中,据说String的最小内存使用量是:
8 * (int) ((((no chars) * 2) + 45) / 8) 字节.
因此,对于String"Apple Computers",最小内存使用量为72个字节.
即使我有10,000个长度为两倍的String对象,内存使用量也会小于2Mb,这根本就不算多少.那么这是否意味着我低估了企业应用程序中存在的字符串数量,或者该公式是错误的?
谢谢
通过小字节数组我的意思是从10长度最多为30个字节的阵列.
通过商店我的意思是将它们存储在RAM中,而不是序列化并持久保存到文件系统.
系统macOS 10.12.6,Oracle jdk1.8.0_141 64位,JVM args -Xmx1g
示例:
预期的行为new byte[200 * 1024 * 1024]是≈200mb的堆空间
public static final int TARGET_SIZE = 200 * 1024 * 1024;
public static void main(String[] args) throws InterruptedException {
byte[] arr = new byte[TARGET_SIZE];
System.gc();
System.out.println("Array size: " + arr.length);
System.out.println("HeapSize: " + Runtime.getRuntime().totalMemory());
Thread.sleep(60000);
}
Run Code Online (Sandbox Code Playgroud)
public static final int TARGET_SIZE = 200 * 1024 * 1024;
public static void main(String[] args) throws InterruptedException {
final …Run Code Online (Sandbox Code Playgroud) 如果我在磁盘上获取大约2kB的XML文件,并将内容作为String加载到Java内存中,然后测量对象大小,它大约为33kB.
为什么规模会大幅增加?
如果我在C++中做同样的事情,内存中生成的字符串对象更接近2kB.
要用Java测量内存,我正在使用Instrumentation.对于C++,我采用序列化对象的长度(例如字符串).
测量堆中的内存应该用于创建某种类型的新对象的正确方法是什么(让我们谈谈Integers以保持简单)?
没有实验可以计算出这个值吗?那种情况下的规则是什么?这些规则是在某处严格规定的还是从jvm到jvm不等?
我读什么-是最内存消耗-的对象-在Java的的和什么-是最内存开销的-的对象-在Java的.
但我仍然感到困惑.
padding吗?JVM压缩指针?是reference吗?32-bit JVM使用,那么开销会减少?当然是.但是因为填充?32-bit JVM使用内存效率或性能更好吗?下图来自此链接(第26页)
在这个图像开始时它们显示为16字节的JVM开销,为什么呢?
java jvm memory-management java-memory-model memory-overhead
我正在研究java,我记得在某个地方读过java对象,在JVM中有一些开销,这是由虚拟机用于管理的原因.所以我的问题是,有人可以告诉我是否以及如何在HotSpot JVM中获取对象的总大小,以及它可能带来的任何开销?
我有一个递归方法,遍历包含数千个音乐文件的大型目录.每次扩展符合条件时,它都会将音乐文件添加到observableList <>.在递归方法执行之前,该列表被挂接到另一个线程中的TableView <>,以便用户可以实时查看正在添加到TableView <>的文件.
问题是我对如何在java中管理内存知之甚少,并认为我可能会妨碍垃圾收集.在大约3,000首歌曲之后,递归方法会占用近6 GB的内存,然后开始忽略它应该能够读取的文件.此外,在"完成"逐步通过目录结构之后,ram不会减少,(即,递归方法的堆栈没有被破坏,我认为所引用的所有对象仍然在堆内存中).
它更进一步..我将播放列表导出到XML文件并关闭程序.当我重新启动它时,内存是完全合理的,所以我知道它不是包含文件的大型列表,它必须与递归方法有关.
这是位于音乐处理程序中的recusive方法:
/**
* method used to seek all mp3 files in a specified directory and save them
* to an ObservableArrayList
*
* @param existingSongs
* @param directory
* @return
* @throws FileNotFoundException
* @throws UnsupportedEncodingException
*/
protected ObservableList<FileBean> digSongs(ObservableList<FileBean> existingSongs,
File directory) throws FileNotFoundException,
UnsupportedEncodingException {
/*
* Each directory is broken into a list and passed back into the digSongs().
*/
if (directory.isDirectory() && directory.canRead()) {
File[] files = directory.listFiles();
for …Run Code Online (Sandbox Code Playgroud) 有没有办法找出scala中对象占用的内存/大小?预先感谢您回复我。