javaset占用内存大小

Python017

javaset占用内存大小,第1张

javaset将占用16个字节的空间。 因此,最初我将条目数乘以16以获取内存。 但实际上,每个条目的内存远远超过16个字节。 之后,我研究了HashSet的实现。 简而言之,在基础实现中,它实际上在哈希集的每个条目中存储了一个额外的伪对象(12个字节)。 还有一个指向下一个条目的指针(8个字节)。 因此,每个条目将额外浪费12 + 8个字节。

因此,每个条目的总内存为:16 + 12 + 8 = 36字节。 但是当我运行代码并检查内存时,每个条目仍然超过36个字节。

可能是代码原因导致的问题,也可能是其他原因导致的问题。

使用dstat和top查看内存使用最高的应用,查到内存占用最高的是java应用,使用2253M内存,但是这台服务器跑了好几个java,具体哪个进程使用top看下资源情况,使用top,使用dstat可以看到java应用整体内存使用率超过了70%,其中pid为16494的进程一个应用占了28.7的内存,使用ps查看16494的线程情况,命令:psp16494-L-opcpu,pmem,pid,tid,time,tname,cmd,看到16494这个pid的应用产生了很多线程。在分析前需要将17417这个id转换为16进制,方便查找信息12[root@localhost~]#printf"%x\n"17417,440916进制为4409。将pid为16494的应用打印到日志中1[root@localhost~]#jstack-l16494>jstack.log。查看内存堆栈信息,1[root@localhost~]#vimjstack.log,[root@localhost~]#vimjstack.log在日志信息中查找刚刚转换的4409。可以看到这个线程状态为WAITING通过查看日志发现有大量的waitingoncondition。1,parkingtowaitfor存在大量线程等待被唤醒,占用大量内存。

Object o=new Object():

在java中空对象占八个字节,对象的引用占四个字节。所以上面那条语句所占的空间是4byte+8byte=12byte.java中的内存是以8的倍数来分配的,所以分配的内存是16byte.

举个例子:

Class O{

int i

byte j

String s

}

其所占内存的大小是空对象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整数倍,所以其占大小为24byte.

当然,如果类里有其他对象的话,也要把其他对象的空间算进去