Java 中的内存使用和垃圾收集
Memory Usage and Garbage Collection in Java
我在 java 中阅读了很多关于内存使用的内容。
我的问题指向游戏制作。
在创建二叉树时,每一帧我都会调用方法多达 500 次。
每个节点都会调用一个函数,并会创建10个局部变量。
- 对于内存使用和/或垃圾收集器是否更好地创建一个单独的 class 来保存所有需要的变量,实例化一次并为每个节点提供对该对象的引用?
如果我的第一个问题实际上更好,那么 "expensive" 从单独的对象调用 .getSomething() 是否比将要获取的内容存储在自己的对象中更多?
谢谢大家!
- 根据经验,您创建的对象越少,您对 GC 的压力就越小。因此,如果您的应用程序中的每个 "node" 都需要访问同一组值,那么将这些值放在一个对象中肯定比一遍又一遍地为每个节点分配它们要好。
- 很可能不会。如果经常执行,JIT 编译器很可能会内联这些调用。
如您问题的评论中所述,本地 原始 变量将在堆栈上分配并且不受垃圾收集的影响。在某些情况下,由于 JIT 编译器的逃逸分析技术,甚至可以在堆栈上分配对象。
一般来说,如果您真的想了解您的应用程序在 GC 和分配方面的行为,您应该分析它(例如使用 Java Flight Recorder 的分配配置文件)并查看 GC日志。
此外,您应该根据这些结果而不是过早地调整您的应用程序。
我在 java 中阅读了很多关于内存使用的内容。
我的问题指向游戏制作。 在创建二叉树时,每一帧我都会调用方法多达 500 次。 每个节点都会调用一个函数,并会创建10个局部变量。
- 对于内存使用和/或垃圾收集器是否更好地创建一个单独的 class 来保存所有需要的变量,实例化一次并为每个节点提供对该对象的引用?
如果我的第一个问题实际上更好,那么 "expensive" 从单独的对象调用 .getSomething() 是否比将要获取的内容存储在自己的对象中更多?
谢谢大家!
- 根据经验,您创建的对象越少,您对 GC 的压力就越小。因此,如果您的应用程序中的每个 "node" 都需要访问同一组值,那么将这些值放在一个对象中肯定比一遍又一遍地为每个节点分配它们要好。
- 很可能不会。如果经常执行,JIT 编译器很可能会内联这些调用。
如您问题的评论中所述,本地 原始 变量将在堆栈上分配并且不受垃圾收集的影响。在某些情况下,由于 JIT 编译器的逃逸分析技术,甚至可以在堆栈上分配对象。
一般来说,如果您真的想了解您的应用程序在 GC 和分配方面的行为,您应该分析它(例如使用 Java Flight Recorder 的分配配置文件)并查看 GC日志。 此外,您应该根据这些结果而不是过早地调整您的应用程序。