阅读this&& this我被推荐使用C / C ++,它具有很好的内存分配功能。
示例: 我有一个应用程序,使5000 JMenuItems(我不需要JTable)。内存最高可达400 MB。当我删除所有内存时,内存为(380--390)MB,我等待2-3分钟。
为什么我不需要垃圾收集器而不是free()方法,因为它不需要根据需要解除内存?此外,据我所知,没有内存泄漏,我使用Java 1.8.0_25。
对64位应用进行测试后 垃圾收集器,因为我已经测试过,即使我已经删除了5.000.000个按钮,也不要释放它拥有1GB内存的内存。关于内存泄漏(我只是将这个按钮添加到列表中,然后使用removeAll()方法删除它们或removeItem()由java库准备好了)。
谢谢!
答案 0 :(得分:3)
为什么我不需要垃圾收集器而不是free()方法,因为它没有将内存解除分配为需要?
因为你需要定义"" JVM认为是什么"需要"是两件不同的事情。如果需要将内存分配给其他内容,则JVM仅需要来释放内存,并且没有可用空间来提供新对象。在任何其他场合它都不是需要。
作为程序员,垃圾收集可以让您的生活更轻松,因为当您不必进行正确释放空间所需的所有引用计数时,避免内存泄漏要容易得多你分配了。这意味着更少的错误。但是垃圾收集是一个复杂的过程,占用了计算资源,因此,在JVM判断值得付出努力之前,它不会被激活。 (实际上,决策很复杂,因为存在次要和主要的垃圾收集,以及使用不同注意事项解除分配的堆的不同区域。)
你的程序在爆发之前不会分配越来越多的内存(除非你确实有内存泄漏)。我有几个月没有停止的Java程序运行,尽管有时每分钟创建数百万个对象,它们也不会爆炸。当它需要时,它将运行垃圾收集器。你认为它应该尽快发生是没有根据的。
请注意,运行垃圾收集并不意味着Java必须将内存返回到操作系统。它通常会保留它自己,以防你想要分配更多的对象。它有一些调整参数,告诉它何时将内存返回给操作系统,并在运行垃圾收集后查询这些参数。如果您有兴趣,请阅读tuning guide。