OSC 第 70 期高手问答 — 实战 Java 虚拟机

叶秀兰 发布于 2015/04/22 08:05
阅读 7K+
收藏 31

OSCHINA 本期高手问答(4月22 日- 4月28日)我们请来了 @葛一鸣(葛一鸣)为大家解答关于 Java 虚拟机的运行原理和程序调优方面的问题。如:

  • 如何定位程序中最消耗资源的代码?
  • 如果处理内存溢出问题?

葛一鸣, 浙江工业大学硕士,国家认证系统分析师,获得 Oracle OCP 认证。长期从事 Java 软件开发,对 Java 程序设计,JVM 有比较深的研究。对设计模式、人工智能、神经网络、数据挖掘等技术有浓厚兴趣,著有《自己动手写神经网路》电子书,力求用 Java 改变世界。

《实战Java虚拟机——JVM故障诊断与性能优化》的 出现是作者对JVM过去的总结和未来的展望。随着越来越多的第三方语言(Groovy、Scala、JRuby 等)在 Java 虚拟机上运行,Java 也俨然成为了一个充满活力的生态圈。本书将通过200余示例详细介绍Java虚拟机中的各种参数配置、故障排查、性能监控以及性能优化。

样章试读:http://www.oschina.net/doc/7206 

为了鼓励踊跃提问,@吴小编 会在问答结束后从提问者中抽取 5 名幸运会员赠予《实战 Java 虚拟机——JVM 故障诊断与性能优化》一书。

购买链接:

京东:http://item.jd.com/11670385.html

亚马逊:http://t.cn/RAKxwiQ

高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就 Java 虚拟机 方面问题向@葛一鸣(本书作者葛一鸣)提问,请直接回帖提问。

加载中
1
葛一鸣
葛一鸣

引用来自“mahengyang”的评论

@葛一鸣 :使用gradle做项目构建时,发现每次启动都很慢,主要原因是因为jvm启动太慢;使用clojure和groovy做开发的时候也有同样的感受,当然,有收费的JRebel可以热布署,减少启动次数,想问一下是否还有其它的方法可以加快jvm启动次数,或者是其它免费的热布署方案?
目前hotspot可以做的是 使用java agent修改类,但是有局限性。只能修改已有方法的方法体,而不能添加新成员/删除已有成员/修改已有成员的签名。


有一个方案是 Dynamic Code Evolution Virtual Machine (DCE VM) http://ssw.jku.at/dcevm/ 里提出的热部署。但是这个东西更新很不积极。没有到商用的程度。自己玩玩可以考虑。


JRebel在处理是,是在类进行加载的时候 就已经把类进行了修改。在一个类里增加了一些占位符,间接达到动态类修改的功能。对性能有一定影响。


因此,收到hotspot本身的限制,没有特别完美的方法。
1
葛一鸣
葛一鸣

引用来自“mahengyang”的评论

@葛一鸣 :使用gradle做项目构建时,发现每次启动都很慢,主要原因是因为jvm启动太慢;使用clojure和groovy做开发的时候也有同样的感受,当然,有收费的JRebel可以热布署,减少启动次数,想问一下是否还有其它的方法可以加快jvm启动次数,或者是其它免费的热布署方案?
再补充一下。另外是否可以参考osgi的方式。用classloader来做热部署呢?
mahengyang
mahengyang
感谢回答,回头我试一下这种方式
0
梦朝思夕
梦朝思夕
如何更换默认的jmv,选择其他的jvm,有哪些可选,特点是什么呢
0
Eumenidies
Eumenidies

@葛一鸣 :1.jvm规范里讲的调用GC()不保证立马回收,那在hotspot里是怎么样的呢?什么情况下不会立即回收呢?我发现每次调用GC()都会引起回收,还没发现过不会收的情况,望指教。

2.最近遇到一个情况,程序里出现大量临时对象,而且全都线程逃逸了,而且无法重用,调节New的内存大小效果不大,调节xms、xmx,xmn的效果也不大,现在的设置是xms1024m,xmx1024m,xmn512m,NewSize512mTargetSuvivorRatio设置的是50%,用jstat监控,现在情况是每5秒gc上百次,耗时将近0.4秒,FullGC极少,主要都是YoungGC,请问能给出优化方向吗?

甘薯
甘薯
回复 @Eumenidies : 好了就行, 经验到手, 嘿嘿
Eumenidies
Eumenidies
回复 @甘薯 : 只要改用G1就立马好了。。。得好好思考下才行
Eumenidies
Eumenidies
回复 @甘薯 : 感谢回复!我会试一试的
甘薯
甘薯
回复 @Eumenidies : -XX:MaxGCPauseMillis这个参数可以设置停顿时间, 如果不满足JVM会自动调整年轻代的大小, 看样子可以满足你的要求(要使用并行GC).这篇文章非常好,你可以仔细读一下.
甘薯
甘薯
回复 @Eumenidies : 另外看看这篇文章, 尝试加大年轻代的内存空间试试看, http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html, 如果你调整过无效的话, 那么就把年轻代的大小加到极限大.同时增加SuvivorRatio的比例, 同时换一个GC试试, 文章中提到使用CMS, 你可以试试看,
下一页
0
mahengyang
mahengyang
@葛一鸣 :使用gradle做项目构建时,发现每次启动都很慢,主要原因是因为jvm启动太慢;使用clojure和groovy做开发的时候也有同样的感受,当然,有收费的JRebel可以热布署,减少启动次数,想问一下是否还有其它的方法可以加快jvm启动次数,或者是其它免费的热布署方案?
0
tianyuanzhonglu
tianyuanzhonglu
@葛一鸣 :JRokit 和 hotspot 整合进度如何,jvm G1 gc对4G~8G的内存管理和CMS相比还有哪些问题?
0
pseudo
pseudo
@葛一鸣 :一直想问一个问题:openJDK与sun的jdk哪个效率高,更适合产品环境呢?
yourOnlyJack
yourOnlyJack
IBM的JDK用在IBM的服务器上性能比较好。
甘薯
甘薯
我觉得产品环境你最好用SUN的.兼容性和稳定性较好, 以前用过IBM的JVM出现很怪异的问题.
0
西夏一品堂
西夏一品堂
@葛一鸣 :你好。现在有很多SSH的项目,在tomcat下面运行的很好,放到其他的如weblogic,websphere下面就各种问题,想问一下这类问题解决的思路是什么
巴林的狗尾草
巴林的狗尾草
这个。。。你引用了大量的apache-commons之类的第三方包吧,jboss之类的都包含了这种包,在你的项目里面把这些引用搞成runtime就好了(用maven的话),反正保证打包不要打到war里面去就好。Root cause是因为J2EE标准里面的classload机制跟Java core的不一致。
0
flink58
flink58

@葛一鸣 :现在很多公司都还是是使用java1.6版本的, 请问这会不会影响未来的发展,毕竟java7都出了这么久,

泥沙砖瓦浆木匠
泥沙砖瓦浆木匠
那需要 你们这代人了~
0
flink58
flink58
@葛一鸣 :请问java内存溢出,怎么解决,有没有什么比较好的开源框架处理java溢出
返回顶部
顶部