简短版本:是的,您可以。
长版本:
Java/JVM 如何管理内存
对于大多数应用程序,JVM 缺省值是可以的。看起来 JVM 期望应用程序只在有限的时间段内运行。因此,它似乎没有自己释放内存。
为了帮助 JVM 决定如何以及何时执行垃圾回收,应提供以下参数:
对于服务器应用程序,添加:-server
这对我来说还不够。我想要更多的控制!
如果上述参数不够,您可以影响JVM在垃圾回收方面的行为。
首先,你可以用它来告诉 VM 你何时认为垃圾回收是有意义的。其次,您可以指定 JVM 应使用哪些垃圾回收器:System.gc()
不同类型的垃圾收集器:
-
串行气相色谱仪
命令行参数:-XX:+UseSerialGC
停止应用程序并执行 GC。
-
并行气相色谱
命令行参数:-XX:+UseParallelGC -XX:ParallelGCThreads=value
与应用程序并行运行次要集合。减少主要集合所需的时间,但使用另一个线程。
-
并行压缩 GC
命令行参数:-XX:+UseParallelOldGC
与应用程序并行运行主要集合。使用更多的CPU资源,减少内存使用。
-
内容管理系统
命令行参数:-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=value -XX:+UseCMSInitiatingOccupancyOnly
执行较小的集合,并且比串行GC更频繁,从而限制了应用程序的中断/停止。
-
G1
命令行参数:-XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
实验性(至少在Java 1.6中):尝试确保应用程序永远不会停止超过1秒。
例
Play Framework Web应用程序的内存使用情况没有任何优化:如您所见,它使用了大量的堆空间,并且使用的空间会定期释放。
在这种情况下,仅使用参数的优化无效。有一些计划任务使用了大量的内存。在这种情况下,最佳性能是通过使用与内存密集型操作相结合来实现的。因此,WebApp的内存使用量从1.8 GB减少到大约400-500 MB。CMS GC
System.gc()
您可以在这里看到来自VisualVM的另一个屏幕截图,它显示了JVM如何释放内存并实际返回到操作系统:
注意:我使用 VisualVM 的“执行 GC”按钮来执行 GC 而不是在我的代码中,因为消耗内存的计划任务仅在特定时间启动,并且使用 VisualVM 捕获起来有点困难。System.gc()
延伸阅读