免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3693 | 回复: 12
打印 上一主题 下一主题

为什么 Java 程序那么喜欢内存?和 JIT 有关? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-13 01:57 |只看该作者 |倒序浏览
一直不明白为什么 Java 程序那么喜欢内存, 2 个 G 都不一定够玩儿。
是 JIT 的原因?可是我也没发现 LLVM 的 JIT 有恋存癖啊?
JIT 在速度上会慢,而且慢不少,这个不牵扯内存啊?熟悉 JIT 和 Java 虚拟机的同学说说吧。我觉得不光是 GC 的原因, C# 也 GC 很多年也没见这么喜欢内存啊?
别的 JIT 比如 UPC 也不了解,C# 这种不开源的就更不了解了。
别让我去看 JVM 的代码,给说说原因吧。

论坛徽章:
0
2 [报告]
发表于 2009-02-16 19:07 |只看该作者
一个C编译生成的机器码程序所占的内存,肯定小于一个Java中间码加JVM所占的内存。因为,前者只保留你所需要用到的功能,而后者却包罗万象。

论坛徽章:
0
3 [报告]
发表于 2009-02-26 10:07 |只看该作者
c#呢?和传统的vc相比较,优缺点呢? 有的说c#的效率低一点,有的说差不多,不知道该听谁的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2009-02-26 15:51 |只看该作者
原帖由 jqbsx 于 2009-2-26 10:07 发表
c#呢?和传统的vc相比较,优缺点呢? 有的说c#的效率低一点,有的说差不多,不知道该听谁的。

其实这要看你怎么定义效率了。越是接近机器的语言理论上越更能接近最快效率的效率,可实际上呢?用的人不同,水平有诧异效率就会不同,并且越是原离机器的语言越是注重特殊方面的优化,有些甚至并不会等到运行的时候去算,甚至会在出厂的时候就生成静态表。效率差异在什么地方呢?
举个最简单的例子:
我用C写了个程序,查找第n个质数,是一上去就开始生成质数表的;
某人开发了个脚本语言,里面定义了一个函数,prime(n)就是返回第n个质数,而这个质数表在他写这个解释器的时候就算好了。
那么,显然我是没它快的,至少第一次去查第n个质数的时候是不可能有它快的,这还不包括如果我的水平很烂,我的质数算法很垃圾。

论坛徽章:
0
5 [报告]
发表于 2009-02-26 17:18 |只看该作者

回复 #4 cjaizss 的帖子

完全同意大多数的分歧都是各自的"定义"有差别引起的。

心里面觉得C#这一层在运行时总是存在的。对于纯算法,或者纯UI,外围设备,可以做到完全透明,在call stack上增加几层,应该不会有明显差别。如果有短路的话,更快了就。总觉得在某些区域应该是不太透明的。 另外,不用另外再搞一套吧,c/c++ 也应该是能实现的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2009-02-26 17:29 |只看该作者
原帖由 jqbsx 于 2009-2-26 17:18 发表
完全同意大多数的分歧都是各自的"定义"有差别引起的。

心里面觉得C#这一层在运行时总是存在的。对于纯算法,或者纯UI,外围设备,可以做到完全透明,在call stack上增加几层,应该不会有明显差别。如果有短 ...

有差别,对指令运行预测有较大影响

论坛徽章:
0
7 [报告]
发表于 2009-02-26 23:12 |只看该作者
原帖由 cjaizss 于 2009-2-26 15:51 发表

其实这要看你怎么定义效率了。越是接近机器的语言理论上越更能接近最快效率的效率,可实际上呢?用的人不同,水平有诧异效率就会不同,并且越是原离机器的语言越是注重特殊方面的优化,有些甚至并不会等到运行 ...


言之有理.

论坛徽章:
0
8 [报告]
发表于 2009-02-27 01:36 |只看该作者
内存占用不太好说
GC本身的话,如果限制Xmx ,那么HEAP就那么大
其他就是JIT Engine, byte code, native binary code等

另外,JIT和静态编译相比,尽管有运行时开销,但因此也可以编译出更好的代码
比如,可以针对特定的处理器优化,也可以针对特别的程序优化(静态编译由于缺乏运行时信息,无法作针对性优化。而JIT可以通过在线profiling,  找出HOT代码,作进一步优化。还可以找出那些数据是经常一起被访问的,在下次GC的时候,把他们放到一起,提高相关性)

论坛徽章:
0
9 [报告]
发表于 2009-02-27 11:21 |只看该作者
原帖由 西风之神 于 2009-2-27 01:36 发表
内存占用不太好说
GC本身的话,如果限制Xmx ,那么HEAP就那么大
其他就是JIT Engine, byte code, native binary code等

另外,JIT和静态编译相比,尽管有运行时开销,但因此也可以编译出更好的代码
比如,可以针对特定的处理器优化,也可以针对特别的程序优化(静态编译由于缺乏运行时信息,无法作针对性优化。而JIT可以通过在线 profiling,  找出HOT代码,作进一步优化。还可以找出那些数据是经常一起被访问的,在下次GC的时候,把他们放到一起,提高相关性)

GC 的确是原因之一,SUN 的宣传也总是“如果不考虑内存模型的话,那么 Java 是...”,可能么?大型服务器上内存几十 G,我的本子才两 G 而已,别指望我把全部的内存都搭上去体验一把“一次编译,到处 debug”
JIT 相关的另一个研究热点就是动态优化,比如 在线 profiling ,这个也是我所关心的。所谓 SUN 说的“Java 的性能超过 C++了”,是绝对可能的,而且在 JIT 里面是很容易做到的,不过前提是内存足够大。
GC 的确可以用来加强关联性,这个也可以作为一个方向,只是希望不要被职业 paper maker 给糟蹋了。

论坛徽章:
0
10 [报告]
发表于 2009-02-27 11:50 |只看该作者
所以JAVA在桌面应用上优势不大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP