自己在网上找到了想要的答案:
jvm不会把已经申请的内存还给OS, 因为很可能马上又要分配给新的对象,每次向 OS 申请内存是很慢的。
所以管理控制台显示的内存使用情况和windows任务管理器中的不一样。
jvm中有两个参数 MaxHeapFreeRatio, MinHeapFreeRatio 可以收缩堆,还内存给OS, 但只在client 模式下有效,而且是分次返还,0% on the first call, 10% on the second call, 40%, on the third call, and 100% by the fourth call.
例如:
java -client -verbose -XX:+PrintGC -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xmx100m -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=30