我应该在我的 java 持久性项目中调用 System.gc() 吗?
Should I call System.gc() in my java persistence project?
我正在使用 Java 持久性 API 来开发一个独立的软件。最近,当我从实体 类 以及 JPAController 类 创建对象时,我发现内存使用量不断上升。似乎对象停留在内存中,因为分配给项目的内存不会减少(例如:400mb ---> 创建对象 ---> 450mb ---> 保持在 450mb)。这会严重影响性能吗?我应该调用 System.gc() 方法来删除这些对象吗?
在我看来,处理问题的方法应该不同。实际上调用 System.gc() 并不能保证它会释放任何内存;请参阅 When does System.gc() do anything
如果您可以通过 jconsole 或对 jvm 转储进行 post 实时分析或其他方式测量内存分配中的问题,那么这就是另一个问题。通过收集这些信息,您将知道在您的记忆区域中还剩下什么,然后采取行动来收容它。
通常 System.gc()
不保证执行垃圾回收。最终由 JVM 决定。见 javadoc.
您是否观察到当您接近 JVM 的内存限制时会发生什么,然后垃圾收集会发生吗?如果没有,并且您收到 OutOfMemoryError
,您要么保留的时间比您需要的时间长,要么实际上需要为您的 VM 分配额外的堆。
无论如何System.gc()
我认为不应该用来解决这样的问题。
这会对程序整个生命周期的性能产生负面影响的唯一方法是,如果您想永远保留这些实体,但堆中老年代的大小小于您指定的 450MB。假设您希望永远保持您指定的 450MB 的 1 到 2 倍,使用 JVM 的默认比率,设置一个参数(例如 -Xmx2g)可能会很好。微调性能的参数远不止于此,但这可能就是您现在正在寻找的所有复杂性。如果您想查看有关堆调整的更多详细信息并真正了解性能,请在 Garbage Collection Tuning by Oracle. Alternatively, something to eat lunch to is a great Youtube video on GC tuning by a guy named Gil Tene.
上查看此文档
但是调用 System.gc() 可能不会做任何有用的事情。
我正在使用 Java 持久性 API 来开发一个独立的软件。最近,当我从实体 类 以及 JPAController 类 创建对象时,我发现内存使用量不断上升。似乎对象停留在内存中,因为分配给项目的内存不会减少(例如:400mb ---> 创建对象 ---> 450mb ---> 保持在 450mb)。这会严重影响性能吗?我应该调用 System.gc() 方法来删除这些对象吗?
在我看来,处理问题的方法应该不同。实际上调用 System.gc() 并不能保证它会释放任何内存;请参阅 When does System.gc() do anything
如果您可以通过 jconsole 或对 jvm 转储进行 post 实时分析或其他方式测量内存分配中的问题,那么这就是另一个问题。通过收集这些信息,您将知道在您的记忆区域中还剩下什么,然后采取行动来收容它。
通常 System.gc()
不保证执行垃圾回收。最终由 JVM 决定。见 javadoc.
您是否观察到当您接近 JVM 的内存限制时会发生什么,然后垃圾收集会发生吗?如果没有,并且您收到 OutOfMemoryError
,您要么保留的时间比您需要的时间长,要么实际上需要为您的 VM 分配额外的堆。
无论如何System.gc()
我认为不应该用来解决这样的问题。
这会对程序整个生命周期的性能产生负面影响的唯一方法是,如果您想永远保留这些实体,但堆中老年代的大小小于您指定的 450MB。假设您希望永远保持您指定的 450MB 的 1 到 2 倍,使用 JVM 的默认比率,设置一个参数(例如 -Xmx2g)可能会很好。微调性能的参数远不止于此,但这可能就是您现在正在寻找的所有复杂性。如果您想查看有关堆调整的更多详细信息并真正了解性能,请在 Garbage Collection Tuning by Oracle. Alternatively, something to eat lunch to is a great Youtube video on GC tuning by a guy named Gil Tene.
上查看此文档但是调用 System.gc() 可能不会做任何有用的事情。