您创建了一个了不起的应用程序。 您将其投入生产。 您会发现您没有足够的可用内存。 即使您的所有测量结果(可能是借助我们的小型公用事业公司进行的测量 )都表明您应该还不错。
我们计划发布一系列博客文章,研究堆消失的位置,并从基础结构版本开始。 今天的假设–我的应用程序服务器可能会成为消耗我所有宝贵内存的贪婪的混蛋吗?要找出答案,我们在五台应用程序服务器上进行了少量测试。
女士们,先生们,让我们介绍一下参赛者:
- Oracle Weblogic 12.1.1
- 玻璃鱼 3.1.1.2
- RedHat JBoss AS 7.1.1
- Apache Tomcat 7.0.30
- 码头 8.1.7
您可能会说,我们这里将苹果与橙子进行比较–通过拥有完整的Java EE配置文件(例如Weblogic,Glassfish和JBoss),与Web容器(如Jetty或Tomcat)竞争。 但是–我们已经看不到看到仅运行servlet的IBM或Oracle部署的情况了,因此我们认为在同一页面上看到所有提到的通用容器将是一个启发。
在开始进行测量之前,我们想向Weblogic团队致以一些个人问候。 用于压缩没有根文件夹的归档文件。 跟踪地狱实际上是什么,我发现了一些乐趣。 其次,向JBoss致敬。 我花了10分钟浏览他们的网站来了解要下载什么。 非常感谢IBM 。 他们的WebSphere不能安装在Mac上。
但是我们并不打算让这个职位成为出色的续集,“ 一切都打破了,没有人难过” 。 因此,让我们继续比赛吧。 到现在为止,我们所有的容器都已下载并准备参与。 我们进行的测试包括每1000毫秒后启动所有容器并收集数据。 我们非常喜欢这种竞赛的科学方法,而且我们也很懒。 这种结合导致我们使用了内部构建的另一个小实用程序 ,并将所有无聊的工作委托给了stats文件。 使用与JVM本身捆绑在一起的JMX API收集了数据。 收集的数据包含可用于JVM的总内存和未分配的内存大小。
所有容器均以“现成的配置”启动,除了将统计实用程序添加到服务器启动脚本之外,我们没有进行任何其他更改。 唯一的例外是Weblogic,其PermGen空间已调整为绝对精度–当我们附加由两个java类组成的代理时,最后出现一条错误消息,提示您增加PermGen的大小。
在整个测试中,我们没有在服务器上部署任何东西,也没有以任何方式使用服务器,包括捆绑的管理员实用程序。 在我们使用kill -9 <pid>杀死所有服务器之前,所有服务器都有90分钟的运行时间。
用于执行测试的机器是运行OS X Mountain Lion的2010年老式64位Macbook Pro。 测试中使用的JVM是Oracle HotSpot 1.6.0_35。
但是足够的背景。 结果不言自明:
从图中可以看出,Tomcat是明显的赢家,它仅消耗了15.63MB的内存 。 Weblogic要求在图表的另一端增加两倍以上的容量,仅为其自身分配33.73MB 。
老实说,我们最惊讶地发现Jetty仅位于第三名。 在测试之前,我们团队内部进行的首轮下注显然使Jetty具有最小的内存占用。 但是,没有,它只有19.66MB ,在Glassfish和JBoss之间仅排名第三,分别消耗了23.26MB和18.89MB 。
总而言之,即使是我们竞争中的明显失败者,也很可能不应对您的应用程序的内存问题负责。 当然,除非您使用的内存非常有限。
我们计划通过排列流行的框架来继续该系列,以查看在开始在典型的Java EE应用程序中编写一行代码之前会损失多少内存。 您想在比赛中看到什么框架? 通过包含@JavaPlumbr的鸣叫让我们知道。
参考: 谁在窃取您的记忆? Plumbr博客博客上的JCG合作伙伴 Nikita Salnikov Tarnovski提出 的Application Servers Edition 。
翻译自: https://www.javacodegeeks.com/2012/12/who-is-stealing-your-memory-the-application-servers-edition.html