堆内存如何工作的解释(Java)

时间:2014-11-19 15:02:24

标签: java jsp heap-memory

我在互联网上阅读了一些内容,但我不确定是否可以使用它。

我创建了一个小网站,它是一台廉价服务器的主机,内存为128mb。 当我启动服务器并访问第一页时,我有这些值(我使用Runtime.getRuntime().totalMemory()Runtime.getRuntime().freeMemory()获取它们):

  1. 总记忆:128974848
  2. 已用内存:42376200
  3. 免费记忆:86598648
  4. 在看到一些页面(有时很少,有时很多)后,总内存减少了。看到其他页面后,它会增加。

    我无法理解这是堆内存行为的方式,还是我的代码中存在错误。

2 个答案:

答案 0 :(得分:2)

  

我无法理解这是否是堆内存行为的方式

是的,这是任何基于垃圾收集的系统的行为方式的要点。

垃圾收集背后的原理是,当不再需要对象时,不会显式删除或清除对象。相反,它们只是超出范围(也就是说,没有活动对象继续引用它们)。对于某些非零时期,这些对象仍将存在于内存中。

垃圾收集器会定期运行,它会找到这些无法访问的对象,实际将它们从内存中删除。垃圾收集器运行的频率以及尝试查找垃圾的难度的具体细节完全取决于确切的算法和任何调整参数(并且可以对应用程序的性能产生显着影响)。但总的来说,当剩下的可用内存较少时,它们往往会更频繁地运行,反之亦然。

要点是,即使你的真实"内存使用或多或少是静态的,你可能会看到一个锯齿类型的模式,因为临时对象被创建,并且暂停一段时间,直到垃圾收集器运行并摆脱它们。这完全正常。

答案 1 :(得分:0)

这很正常。不同的网页将根据其中包含的内容使用不同数量的内存。我担心的是,如果你继续打开页面,内存永远不会被释放。这是memory leak,如果您正在开发Web浏览器,则会引起关注。

总内存也可能会减少,因为服务器会保留有关谁方便请求网页的信息,因此它可以在将来更快地为它们提供服务。一个例子是亚马逊存储您搜索的产品的方式,以便在您浏览时可以推荐其他商品。