Java中的内存使用情况和垃圾回收
问题描述:
我已经阅读了很多关于java内存使用情况的内容。Java中的内存使用情况和垃圾回收
我的问题指向游戏制作。 当我创建一棵二叉树时,每一帧我都会调用500次方法。每个节点将调用一个函数并创建10个局部变量。
- 是它的内存使用更好,或垃圾收集来创建一个单独的类,它包含所有需要的变量,实例化一次,并给每个节点到该对象的引用?
如果我的第一个问题实际上更好,从一个单独的对象中调用.getSomething()而不是存储您想要获取的对象中的东西更“昂贵”?
谢谢大家!
答
- 作为一个经验法则,您创建的对象越少,您对GC的压力就越小。因此,如果应用程序中的每个“节点”都需要访问相同的一组值,那么将这些值放入一个对象中肯定会比将它们重复分配给每个节点更好。
- 最有可能不是。如果经常执行这些调用,JIT编译器很可能会内联这些调用。
正如你的问题的评论中提及,当地原始变量将在栈上分配和不受垃圾收集。在某些情况下,由于JIT编译器的转义分析技术,甚至可以在堆栈上分配对象。一般来说,如果您真的想了解您的应用程序在GC和分配方面的表现如何,您应该对其进行分析(例如,使用Java Flight Recorder的分配配置文件)并查看GC日志。此外,您应该根据这些结果调整您的应用程序,而不是过早。
*本地*变量存储在调用堆栈中,并在方法返回后立即释放。因此他们不符合GC的资格。那当然没有提到局部变量引用的任何对象,但是它们如何受GC影响完全取决于对象有多少不同的引用,所以不可能说没有更多信息。 – Andreas