有一 Java 控制台程序,启动经过一段时间之后从 Windows 任务管理器里看它所占用的内存稳定在 540M 左右。
启动参数是:-Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128
但只要你把那个控制台窗口最小化后,观察到的内存用瞬间下降到 100 多M,有时候甚至是几十M。然后不管是窗口保持最小化还是恢复了,它所占用的内存又以几十M几十M的上扬,直至先前的 540 M 左右。每次最小化窗口都可以观察到这种现象。
控制台窗口的参数:屏幕缓冲区大小:宽 120;高 300。窗口大小:宽 120;高 40。
不知道在控制台窗口最小化那时,JVM 做了些什么事情能让内存骤降下来,而复又升回去。
本文链接 https://yanbin.blog/explain-java-console-memory-leak/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
这个问题以前也看到过类似的情况,包括自己在使用一些软件的时候。
一会问问旺财看看。
JVM没有做什么工作,是Windows操作系统干的活。你可以在Windows任务管理器中选择“查看→选择列”,然后选中“虚拟内存大小”,再最小化会发现内存使用资源,但是虚拟内存不变。
因为Windows操作系统从理论上给每个应用分配了4G内存,但是实际上每台机器的内存有限,因此就采用了虚拟内存的技术,最小化时被切换到后台,许多内存就释放出来供其他应用使用,而原来占用的内存空间由硬盘代替。
非常感谢你的回答,不知窗口最小化的时是否会变动到进程的优先级?会稍稍让出一些 CPU 时间来。
内存回复上去也就是意味着硬盘中的内存数据又重新调回到内存中了。
那也就是根本不用去在意这种内存的变化,完全是操作系统自己的事情。
@隔叶黄莺
对,进程优先级的情况可能需要关注OS的管理方式了,理论上是不会发生改变的,只是被放在后台而已,如果这个应用一直是忙碌的,内存都不会发生在大变化。
因此,平时研发的时候无需关注这种内存的变化,如果想了解程序内存使用情况还是打开虚拟内存比较准确。
要区分JVM的内存管理和操作系统的内容管理!!!
不然,还有狂多类似的问题是解释不通的 ~_~