当我在Eclipse中使用Garbage Collection和Memory Visualizer时,我不清楚我的应用程序实际需要多少内存。看这张图:
在0:12时,它已获取了超过0.4 GB的空间。我知道它获得的堆(图中的堆大小)超出实际需要。但是我想看到的是它真正使用了多少内存。其他两个图形只会混淆图片。我可以在gcmv中做到吗?
最佳答案
对于使用多少内存这个问题尚无明确答案,这取决于所用内存的定义。有时,JVM将获取内存,而应用程序将通过写入内存来使用内存,以便以后可以读取它。您可以说,它使用内存,只要稍后会再次访问该内存。如果您永远不会读取一个值,则确实不需要存储该值的内存,但是要确定应用程序是否要再次读取它是一个技术难题。
预测以后是否会有访问的一种方法是利用对象结构并将每个无法访问的对象视为未使用。这种称为垃圾收集的分析在某些时间点运行,因此在这些时间点,我们通常会发现实际使用的内存小于两次垃圾收集运行之间应用程序使用的内存。但是在这些点之间,没有关于可到达对象的已用存储量的知识。
因此,您会在图表中看到两个图形,一个图形表示应用程序已在两个垃圾回收周期之间将数据写入其中的内存,另一个图形连接了垃圾回收后生成的仍可访问的内存。假定所需的大小介于两者之间。对于任意时间点,较高的“收集前”值是由于应用程序使用了它们而没有进行垃圾收集的事实,但是,如果那时发生了垃圾收集,则实际使用的(仍可到达的)内存可能会低于此值,但不太可能低于“收集后”值(尽管尚不确定)。
为了安全起见,请确保始终至少有足够的内存与已记录的“收集前”值可用,并且应用程序应仅按已记录的过程运行。但是,您可以将可用内存减少到“收集前”和“收集后”最大值之间的一个值,并且仍然可以成功运行应用程序,但是使用不同的垃圾回收周期,可能会花费更多的CPU时间进行垃圾回收。