我试图弄清楚Spring Boot应用程序消耗了多少内存,我想将结果与运行相同Spring Boot应用程序的Docker容器进行比较。为此,我使用了PetClinic应用程序,并向其中添加了一个Dockerfile。这是带有我的测试的项目:https://github.com/wearearima/spring-boot-docker-study
首先,使用JConsole在运行Garbage Collector之后检查了堆的使用情况,结果为45MB。但是,请记住,Java应用程序比堆消耗更多的内存(例如元空间,代码缓存和类空间),因此我使用了ps au $(pid)
命令来获取Java进程使用的内存。该命令的输出表示RSS值为60MB,因此我猜想Spring Boot应用程序占用60MB的内存。
然后,我在Docker容器中运行相同的应用程序,并执行了docker exec ps 1 -o rss
命令以在容器中获取RSS值。令人惊讶的是,结果是520MB。
我不明白为什么ps
命令在容器内部和外部给出不同的结果。如果过程相同,我希望得到相似的结果。但是,两个结果60MB和520MB之间的差异是巨大的。
有些事情我误会了,但我不知道是什么。也许RSS值是该进程使用的内存,但未与任何其他进程共享?并且由于容器内的Java进程是隔离的并且不共享任何内容,因此RSS值更高吗?
任何帮助将不胜感激:-)