Eclipse也是在JVM上运行的,所以修改eclipse.ini文件中的配置,只是修改了运行eclipse IDE的这个JVM的运行参数。
也就是说,如果修改eclipse.ini为
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
表示:启动JVM运行eclipse时,设置最大perm size为256M,堆最小为40M,最多分配256M。一般情况下,这个配置运行这个eclipse IDE是足够了。在运行程序时,控制台上打印的OutOfMemoryError:heap基本上和这个无关。
程序时的内存溢出应该修改程序运行时的JVM运行参数。Eclipse中,修改方式为:Run -> Open Run Dialog,选项卡Arguments中,VM arguments中添加-Xms256m -Xmx1024m,表示运行程序时,最小堆内存需要分配256M,最多需要分配1024M。如果你的内存空间无限大,你可以把这两个值写得无限大,然后就永远不会出现内存用完的错误了。
但是如果你愿意,还是可以把编程看成一门艺术的。怎么有效的利用内存空间?怎么在时间和空间之间权衡取舍?所以多了解一些java内存管理相关的一些内容总是不坏。
1. 对象创建的方式是否经济?是否可以用缓存、缓冲区来避免重复的、大量的对象创建?Lucene3.0中用attribute替换了Token,就是一个很好的样例。但是,得处理好多线程中临界区的同步互斥。
2. 是否有对象的间接引用没有清除?例如,是否清除了所有在Collection中的对象引用?往往由于粗心,会在这里不小心犯错。
查看java内存使用细节的工具很多。JDK自带的工具中,就有很多很好用的。网上有介绍文章《jstat,jmap,jconsole,jvisualvm,jps,jinfo等JDK系统监控、性能调优工具》(http://zior.org/archives/299.html)
以下记录记录我使用各个工具的小小收获。
Jconsole
是多文档的一个窗口,可查看程序运行时的不同方面的统计数据。比较强大。
命令行工具
具体深入细节有一些命令行工具。这些命令行工具和javac、java同目录,配置好path就可以使用。工具的命令都很简单,使用很方便,但是功能实在太强大了!文档中提到,这些工具是试验性质的,不一定所有版本都有。。。
jps: 列举jvm上运行的java线程
jmap: sun提供的文档:http://download.oracle.com/javase/6/docs/technotes/tools/share/jmap.html
注意其中的DESCRIPTION:在windows中仅支持jmap -dump:<dump-options> pid(以二进制格式输出堆内存信息到文件中)和jmap -histo[:live] pid(类内存使用的柱状图)两种命令。非常强大!可编程循环调用,以查看程序运行期间,所有类在不同时期占用内存的细节(具体到byte)。内存泄露、突发的大量类创建都能在控制之中。
jhat: java heap analyzer tool。
Sun提供的文档:http://download.oracle.com/javase/6/docs/technotes/tools/share/jhat.html 。可以将jmap导出的堆的二进制数据用一个web server的形式提供查询分析,可输入object query language查询,也可以直接浏览页面查看。默认端口7000,在页面底端有生成好了的查询。在这里也可以查看类的使用的柱状图。
jstat: 统计gc和堆、非堆内存信息。统计得更全面一些了。网络中有文章记述:《jstat – Java Virtual Machine Statistics Monitoring Tool》(http://www.meichua.com/archives/tag/jstat),《JDK之jstat的用法》(http://www.51testing.com/?uid-77492-action-viewspace-itemid-203728)等。注:其中vmid在本地机器上就是指进程号,在远程机器上需要加上主机名、端口等信息。
(附:其他JDK自带的,很强大很强大的命令行工具,在java官网中有汇总文档:《JDK Tools and Utilities》http://download.oracle.com/javase/6/docs/technotes/tools/index.html#java)