Java微型网络程序GC调优练习 简介 最近用java写了一个微型的网络程序,没进行GC调优的情况下就已经满足性能要求。不过想通过对这个程序调优,再熟悉一下GC调优流程。 通过活跃数据大小设置堆内存大小 活跃数据大小指的是应用程序员运行于稳定态时,长期存活的对象在Java堆中占用的空间大小。所以可以在程序稳定运行时,进行多次Full GC,之后再查看Java堆的占用情况来测量活跃数据大小。 调优过程需要一步一步多次确定更合适的值,JVM的初始参数和版本信息如下(堆大小按感觉先随意分配256M,如果有溢出再调整): -Xms256m -Xmx256m -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:MaxDirectMemorySize=512m -XX:+PrintCommandLineFlags -XX:+UseParallelGC java version "1.8.0_241" Java(TM) SE Runtime Environment (build 1.8.0_241-b07) Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode) 其中 -XX:+PrintGCDetails 参数表示打印垃圾回收情况, -XX:+PrintGCTimeStamps 参数表示每次打印的时候带上JVM启动到当前时间的秒数,也可以使用 -XX:+PrintGCDateStamps 打印日历时间。 -XX:+UseParallelGC 是java8在Windows64上的默认选择,表示同时启用多线程新生代和多线程老年代的Parallel垃圾收集器[1],这一点可能跟旧版本的java不一样(对旧版本java的没太多研究)。 用这个程序来看平均速率在200KB/S左右的直播。运行一段时间之后,程序达到稳定状态。由于这个程序在256M内存下,不经常发生Full GC,所以在程序稳定运行的时候,用 visualvm 触发多次Full GC。每次Full GC的结果比较相似,选取其中一个显示如下(已调整换行): 1887.144: [Full GC (System.gc())