javaset占用内存大小

Python016

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存在大量线程等待被唤醒,占用大量内存。