我有一个我构建的实用程序,并且作为一个如此小的专用实用程序,当我在测试期间注意到它使用150mb的内存时,我感到非常惊讶。我以1MB的堆设置运行它,它仍然占用了超过50mb。
在剖析并花了一天时间试图弄清楚我哪里出错之后,我决定测试一个理论。我的实用程序连接到专有应用程序。该连接需要应用程序供应商提供的外部库。
我使用该库编写了一个小型Hello World,并注意到以下内容:
1)从供应商库中声明一个新对象会立即将内存使用量提高到50MB(主要是permgen空间)
2)实际上尝试连接到应用程序服务器会使内存使用量增加到150MB。
就我而言,这只是愚蠢的。
我想知道是否有任何可能的方法来驯服野兽。也许以某种方式卸载我知道不必要或不会被引用的类。供应商不会很快改变。
或者只在必要时才加载供应商的库?这样,它只会在与应用服务器通信时占用大量内存。
答案 0 :(得分:4)
JVM仅加载您实际使用的类。实际上它只加载实际使用的方法。例如如果你没有使用的方法中有字节码错误,你就不会知道。 ;)
减少供应商库大小的最佳方法是让他们改进它,或者自己编写。
不幸的是,分配适当的应用程序并不是非常有利于资源。他们的首要任务是正确性。 :J-
顺便说一下:150 MB的内存大约需要6美元,所以我不会花费太多时间来解决这个问题。