[英]How does Java manage to use so much memory in Applet mode?
我一直在编写要在浏览器中部署的Java Swing小应用程序(对于小应用程序,这是ios正常的做法)。 它使用Java 2D
无论如何,我有一个用于开发目的的测试工具,可以将其作为桌面应用程序运行。
根据完全相同的测试数据,Test Harness版本的堆总大小为18 Meg; 这是基于在Java 2D画布上绘制大约7000个对象以及大约30,000个坐标对以及其他点点滴滴的结果,因此18 Meg堆很大,但是几乎可以理解。 应用程式总大小为40 Meg。
现在,我通过IBM Websphere运行与Applet完全相同的代码。
插件的内存增量大约为160Meg! 不知何故,相同的Java代码设法使用10倍的内存。
我对旧的CBM64程序员的印象并不特别深刻-它是一个数量级肿的IMO,但第二个令人惊奇-有人知道可能会使用这么多的内存吗? 我正在使用VisualVM,它有助于将诸如Object,char []和String之类的内容放入内存中,而我的类都没有关闭。
有趣的是,Float和Double似乎占用了完全相同的内存量(每个内存16个字节)。
我现在的主要猜测是,使用SOAP进行数据检索导致内存使用量激增,并且由于未知的原因,将保留SOAP XML而不是GC。
还有其他人对这里发生的事情有任何线索吗?
找到了-还是有点。
当您使用Axis 1.3进行SOAP调用时-首先要获取数据-在下一次调用之前它不会释放SOAP XML。
不幸的是,在这种情况下,只有一个初始数据填充调用,因此Axis挂接到了约150Meg的XML上。 足够简单的解决方法,再进行一次“空”调用以将其清除。 GC一切都很好。
JVM总是分配一个内存池,该内存池大于其所需的内存,或者实际上可能在任何给定时间正在使用。 JVM的内存使用情况的任何外部度量都可能会引起误解。
JVM出于一些相当明智的原因执行此操作:
您可能只是看到此行为的结果。 除非您实际上遇到问题(例如OutOfMemoryError-可能表明您存在内存泄漏),否则不必担心。
ps浮动对象和双精度对象都占用16个字节的原因很可能是a)它们具有对象标头,b)然后对其进行填充以确保高速缓存行/内存寻址对齐。 如果在数组中打包很多浮点数/双精度数,那么您会发现它们分别占用4和8个字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.