我们有一个Java Web服务器,该服务器通常决定在运行服务时进行垃圾收集。我们想告诉它在闲置的时间内进行垃圾收集,而没有服务运行。我们该怎么做?
您需要能够找出网络容器何时闲置,这可能取决于您使用的Web容器。
,但我认为这是一个坏主意。强迫GC运行的方法是致电System.gc()
。如果这样做(!(通常会触发大型垃圾收集,并且可能需要很长时间(取决于GC算法(。此外,无论您是否需要运行GC 1 ,手动触发的集合将发生。并且在运行GC时到达的任何请求将被阻止。
通常,最好让JVM决定何时运行GC。如果这样做,则在有效的情况下,GC将运行,并且大多会运行快速的年轻空间收集。
如果您关注由长GC暂停引起的请求延迟/抖动,则更好的策略是调整GC以最大程度地减少停顿时间。(但是要当心:与吞吐量收集器相比,低pause收集器的开销更大。这意味着,如果您的系统已经大量加载了很多时间,那么这可能会增加平均响应时间。(
其他要考虑的事情包括:
- 调整您的应用程序以降低其产生垃圾的速度。
- 调整您的应用程序以减少其堆工作集。例如,您可能会通过应用程序减少内存中的缓存。
- 调整Web容器。例如,检查您没有太多的工作线程。
1-运行GC的最佳时间是有很多可收集垃圾。不幸的是,应用代码很难知道何时。JVM(另一方面(可以跟踪有多少可用空间,以及何时是收集的好时机。答案并非总是在堆满的时候。