<div>最近用JProfile测试一个比较大的工程,希望能找到一些程序运行的瓶颈。过去使用Hibernate,很多人反映效率低。特别是懒加载关闭的时候,对象的持续生成最后会导致JVM直接OutOfMemory错误。目前使用iBatis,发现临时对象还是特别多,一开始百思不解。通过使用JProfile以后,终于找到了原因所在。</div>
<div></div>
<div>对象引用关系:baseView ->InstanceModel -> City</div>
<div>其中,baseView 引用了InstanceMode,而InstanceMode 引用了City对象,City对象是一个比较简单的对象,只有id、name、中文名称等属性。在工程实际使用环境中,InstanceModel 是比较多的,可能会有数万经常被使用。通过对JVM堆的观察,发现每次InstanceModel对象生成的时候,都会附带出大量的City对象。由于一般应用中City的个数都有限,所以程序中专门对City对象作了缓存。为什么会产生大量City的临时对象呢?</div>
<div>通过在JProfile中查看堆的情况,可以很清楚的看到上述引用关系。这很正常啊?纳闷中,反复查看堆、对象、引用关系等信息,终于发现了线索。那就是,被引用的City对象中只有ID值,没有中文名称等其他信息。这就让我们找到了突破口,通过与开发工程师的交谈,被告知只使用了ID值,没有使用其他的属性。于是我们找到iBatis加载baseView对象的映射文件:</div>
<div><span style="font-size: 10pt;"> <span style="color: #a65700;"><</span><span style="color: #5f5035;">resultMap</span> <span style="color: #274796;">id</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"baseView"</span> <span style="color: #274796;">class</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"View"</span><span style="color: #a65700;">></span></span></div>
<div><span style="font-size: 10pt; color: #a65700;"> …</span></div>
<div><span style="font-size: 10pt;"> <span style="color: #a65700;"><</span><span style="color: #5f5035;">result</span> <span style="color: #274796;">column</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"CITYCODE"</span></span></div>
<div><span style="font-size: 10pt;"> <span style="color: #274796;">property</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"InstanceModel.city.id"</span> <span style="color: #274796;">jdbcType</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"NUMERIC"</span> <span style="color: #a65700;"> /></span></span></div>
<div><span style="font-size: 10pt;"> <span style="color: #a65700;"></</span><span style="color: #5f5035;">resultMap</span><span style="color: #a65700;">></span></span></div>
<div>注意,在上面这个定义文件中,加载View对象的时候,从同一张数据库表中,加载了View所属的City的代码(id)。但是iBatis框架在达到这个目的的同时,生成了一个临时City对象,并把ID赋了值。这就是原因!!</div>
<div>好了,原因找到了,优化的方案自然就出来了。只需要去掉InstanceModel对City对象的引用,直接取City的ID就行了!再次运行JProfile,发现不再生成大量的City临时对象,优化的目的达到了。</div>
<div></div>
<div>结论:使用Hibernate、iBatis等框架的时候,我们过于热衷于对象引用的方便,忽视了这种方便的代价。有时候,我们只为了使用一个简单类型的数据,却大量加载肥胖对象而不自知。然后抱怨框架效率低,有问题。其实回头看看,良好的数据库设计、良好的对象设计这些基本的东西,是任何框架都不能帮我们做的。同时感叹JProfile这种强大工具给我们带来的好处,让我感觉又回到了DOS Debug 的时代。</div>
分享到:
相关推荐
非常好用的java调优工具Jprofile
JVM调优工具Jprofiler内存泄漏定位的简单分析(附源码)(二)
Jprofile检查内存泄露问题以及资料
jprofile9+注册码,第一个验证码验证可用;jprofile9+注册码,第一个验证码验证可用;
idea jprofile 插件欢迎下载。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
由于我只能传20M的附件,所以无法将JProfile6.2.2的安装文件上传上来,所以只上传了一个sn序列号,用户名和公司随便填即可注册成功。我在win7和ubuntu下都试过可以破解,附上官方安装文件的下载链接。 Linux:...
Jprofile linux 版本带license
jprofile配置实例.rar jprofile配置实例.rar
Jprofile 安装 破解版 已经试验过了,完全可用
JProfile在linux系统的安装和配置doc文档 Jprofile5.2.4 Windows和Linux安装文件 由于上传资源限制为15M,所以分三部分上传
jprofile9.2 mac版本。
JProfile 8.0.5破解文件及注册码,java 堆栈监控
jprofile-9.2 注册码,亲测可用。
jprofile11 亲测可用.有需要的可以直接下载
简单的性能问题很容易分离并解决,然而,大的性能问题,如内存溢出或者系统的罢工,通常在系统处于高负载情况下发生,就不能这么简单的处理了。这些问题需要一个独立的测试环境、一个模拟的负载,并且需要仔细地分析...
Jprofile4.0破解版 .JAVA项目很好的监控软件,线程,内存对象占用等
Mac版JProfiler+JVM性能调优工具。 JProfiler 的内存视图部分可以提供动态的内存使用状况更新视图和显示关于内存分配状况信息的视图。所有的视图都有几个聚集层并且能够显示现有存在的对象和作为垃圾回收的对象。
jprofile 内存分析工具,jvm
jprofile9.2 linux版本。。。。。。。。。。。。。。。。。。。。。。。。。。。
JProfile的安装和使用说明,本机监控配置,远程监控配置,还有应用实例。