首先声明该贴不是企图引起两个阵营开发者对骂的月经贴,希望从纯粹的技术角度请大家谈一谈对JVM/CLR的认识。众所周知,Eclipse和VS系列分别是Java、.Net开发中最优秀的IDE,但是我一直很困惑为什么Eclipse的内存占用比VS2010(2010以下的版本就不说了,本地代码写的IDE没有可比性)高了一倍多?我知道这不会单纯是虚拟机实现水平的问题,其中可能有各种原因,请了解的人说一说吧。
另外,JVM默认的GC策略和CLR有比较大的出入,我感觉是JVM在物理内存有剩余时,几乎不进行GC,所以Eclipse、Netbeans等大型软件通常开了一段时间之后内存会上升到0.5-1G,非常的可怕。不知道是不是只有GUI程序才这样(自己开发的服务端程序没有发现这种情况,也看不出和.Net程序在内存使用上有明显差别)。希望对这两个虚拟机有了解的人谈一谈你的认识,内存占用上差别是否真如两款IDE所表现出来的那么大?另外,有什么办法能显示Eclipse的内存占用。从技术角度讨论,大家不要吵架。

解决方案 »

  1.   

    和本文主题有些偏。eclipse和vs没法直接拿来比较内存的占用。
    eclipse的构架和vs差别很大。最明显的一个例子,最小化安装的eclipse,竟然无法开发java,但是同样一个eclipse下,你可以装上n多个插件,然后同时在一个workspace下开发java(jdt),c/c++(cdt),php(pdt),flash(fdt),perl.....,而vs里面(2010还没用过,但是本人之前的版本都试用过),就直接区分为若干个不同的xxx 2010程序。同时,还能运行很多很多其他插件,加载的功能多了,内存自然就上去了。
      

  2.   

    VS2010功能很丰富了,不少于一个不外挂插件的Eclipse JEE版。VS2010在开发WPF时,可视化的开发方式,内存也不到200M,要是Eclipse,至少得300。而且从VS2005开始,也是支持插件的,可以扩展功能。
    不过,我更为关注的是,为什么Eclipse继续用一段时间之后,内存会无节制地增长,然后到6、7百兆开始卡了必须重启IDE,这是SWT(用了本地控件、不知道对象释放会不会有漏洞)的问题还是JVM的问题?请大家多多多多指教,或者发表一下想法,共同探讨。
      

  3.   

    对于普通开发者,可能是的。但是如果仔细琢磨的话,可能还差很远。刚刚问人远程看了一个vs2010,大致看了看里面的菜单和特别是设置部分,好像还是略微有些简陋。
    你见过几个用VS装插件的?有几个eclipse不装插件的?jvm和eclipse(我不觉得是swt)各占一半责任,jvm的垃圾回收需要tuning一下才能比较好的发挥。而eclipse打开.java,.jsp,.html,.xml,.properties都会加载不同的editor和设置,每开一种,内存消耗自然会上去。然后还有不同的视图。所以,对于资源紧张的用户,建议大家尽量默认用text editor打开.xml之类文件。同时及时关闭不用的project/perspective/file,卸载掉一些不必要的插件,特别是装myeclipse的,workspace设置>General>Startup and Shutdown里面,跟你项目没关系的,全关!
      

  4.   

    谢谢你的回复。这个你是指Web开发吧,对于一般开发来说,Eclipse本身的插件就已经很足够,像我们前段时间一个服务端项目,20多人的团队,IDE只额外加了SVN插件,没有其他。我们也做了管理控制台,一个Extjs做UI的Web项目,也是用Eclipse本身的wtp就够了。不过插件不插件不是我讨论的主题,Eclipse内存爆上去之后,即使闲置多久,内存也不会释放下来,必须关掉重启,这是很纳闷的地方。
    顺便说一下,我的是去年的机器,酷睿2.7G,2G内存,JDK1.6u18,Eclipse3.5。在我机器上运行Eclipse不慢,可是它一直渐渐地增加内存占用,开一天之后就开始卡了(每逢在Java Editor复制黏贴开始卡的时候,我就打开任务管理器,一看java进程肯定吃着5、6百内存,这个相信大家都有经验吧)。
    我注意到VS2010有一个现象,闲置一段时间之后内存就会悄悄降下去,这才是我们认为的正常行为啊,难道Eclipse缓存着所有用过的资源?
      

  5.   

    我的 eclipse 内存占用从来没有超过 300MB 过啊,基本上在 200MB 上下的。 
      

  6.   

    1:Eclipse 使用 eclipse 官方的 Eclipse JEE 版本。如果用 MyEclipse 的话,内存四五百兆的占用是很正常的事情。插件的安装尽其所用,不要一股脑地全加进来。2:一个工作区尽量放有限个工程,一般五六个就差不多了,我曾听某人说他的工作区中竟然有 30 多个工程,这样不慢、内存占用不高才出鬼了。3:禁用各类验证 Window --> Preferences --> Validation 点 Disable All4:禁止 Eclipse 自动更新5:打开 Eclipse 的垃圾桶,点击那个垃圾桶可以强制 JVM 进行内存回收。Window --> Preferences --> General 把 Show heap status 勾上,这时在 Eclipse 的最下面会出现个带有垃圾桶的条形图。 
      

  7.   

    6:把工作区中不用的工程先 Close 掉,这样也会使 Eclipse 的启动速度更快一些。
      

  8.   

    Java 的内存占用不能只看 Windows 任务管理器中的内存占用情况。JVM 会先霸占一些内存,然后再慢慢地分配,这与 Windows Vista 及以后版本的 SuperFetch 技术有点类似。可以通过 JVM 的 -Xms 和 -Xmx 启动参数来调整 JVM 的内存占用。
      

  9.   

    谢谢火龙果,你的方法很有效。Show heap status不错,用Eclipse这么久居然都不知道啊,真惭愧。不过回收Hepap内存之后,进程所占的内存没有变化,不知道是我哪里理解不对吗?另外想请教一下,不知道你有没有.NET开发的经验,内存占用和Java比起来怎样?我们之前一个产品客户端是用Swing做UI,功能比较多,但是内存占到300以上,用户意见比较大,都说性能上有点难接受。现在开发该产品的下一个版本,Java GUI的内存占用还是一个风险。
      

  10.   

    在Eclipse.ini里配置过-Xms 和 -Xmx,不过从来没感觉到它起了作用。 囧
      

  11.   

    今日又发现一点东西,就是Windows的任务管理器没有正确显示.net程序占用的总内存,vs2010的进程devenv在任务管理器中显示占用的内存100多M,但是关掉VS2010后,总内存释放了超过300M,反复启动/关闭VS2010多次,结果一样。
    而关闭Eclipse,则释放的总内存则和jvm进程占的内存恰好匹配,非常“诚实”。
    我怀疑,VS2010是不是将很多功能放到了Windows服务中去了,一致进程本身占的内存少,这是一种“作弊”的方式还是说能提高效率呢?常规Windows程序会采用这种方式吗?
      

  12.   

    vs2010没用过。但是2008是用过的。其实,我觉的最大的原因是因为我们在windows下运行的。这个没话说。人家自家的产品怎么不优化呢?其实看看,反应速度,我觉得反而是esplisp更快。我觉得,这个有点相比较浏览器占用的内存一样。其实都差不了多少的。只是在任务管理里看,就差很多了,为什么?因为有些浏览器把一部分数据放到硬盘里去了——虚拟内存,让人看得很爽,我的内存占用这么少!!!但是,反应还是很慢!
      

  13.   

    不过怎么说Eclipse确实占用资源大了一点,不过功能更强大!