免费注册 查看新帖 |

Chinaunix

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

Java程序性能优化 ,您从何入手?(获奖名单已公布-2012-11-22) [复制链接]

论坛徽章:
0
1 [报告]
发表于 2012-10-19 23:39 |显示全部楼层
蓝色蜻蜓 发表于 2012-10-19 21:29
程序调优绝非易事,尤其是在操作系统中监控到cpu使用率不断上升直至达到100%,而在应用日志中却找到不到任何 ...


是的。梳理线程以及锁之间的关系,确实很烦人。Thread Dump里信息繁多。很难分析。不过也有些工具可以使用,减轻分析的工作量。比如Thread Dump Analyer(书中第6章有简单的介绍)这些分析dump文件的工具。

论坛徽章:
0
2 [报告]
发表于 2012-10-22 18:11 |显示全部楼层
hbsycw 发表于 2012-10-22 17:58
刚才开会去了,现在先来回答第一个问题:

1.Java中字符串分割的性能讨论
首先,JDK提供的类库里面,对字符串分割可以有三种方法,String.split(); String.SubString() 以及 java.util.StringTokenizer(); 读下源码应该知道其性能应该大致是:SubString() > StringTokenizer() > split()


是的,但是要注意subString()这个东东,会导致内存溢出哦。如果你不即使释放资源的话。书里面第3章有详细的介绍。所以处理大字符串的时候,最好要注意点。split()虽然慢点,但它可以支持正则表达式,用起来还是有点方便的。最快的方法就是自己实现啦,用indexOf()之类的函数自己做,性能最好。但是比较麻烦~~

论坛徽章:
0
3 [报告]
发表于 2012-10-22 19:24 |显示全部楼层
回复 9# hbsycw


    嗯,是的。终于有人回复我了。激动呀~

论坛徽章:
0
4 [报告]
发表于 2012-10-23 09:54 |显示全部楼层
realmon 发表于 2012-10-23 09:19
关于字符串分割:
jdk推荐用split()并不推荐用StringTokenizer
StringTokenizer is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use the split method of String or the java.util.regex package instead.
.
不知道以后会不会移除StringTokenizer
.


在正式移除前,肯定会先标明@Deprecated的。到时候,在不用好了。不太可能直接移掉他的。而且很多@Deprecated的东东,好几年了,还在 呵呵。

论坛徽章:
0
5 [报告]
发表于 2012-10-23 20:52 |显示全部楼层
hbsycw 发表于 2012-10-23 18:13

本帖最后由 hbsycw 于 2012-10-23 18:23 编辑


继续回答第二个问题~

2. 如果程序性能不如人意,如何找到代码中的性能瓶颈

这个问题比较大,我尝试来回答下: 程序性能不如意,首先,应该从系统架构来看,业务逻辑是否合理,处理过程是否可以简化或者优化?硬件资源的配置是否到位?系统的软件架构是否需要进行调整?其次,应该从网络计算资源的使用,比如一些关键指标数据,系统吞吐量、CPU的使用率、内存使用率、网络延迟、磁盘IO等,结合日志来诊断问题代码的所在;最后,合理的JVM参数设置、调优等,这些都需要在真实的业务场景下,在压力测试中暴露问题,解决问题。对于WEB的应用来说,一般后面的数据库应该是一个系统瓶颈(并发和磁盘IO),这个在系统架构,数据建模,针对具体数据库的调优都有很大的空间来做,代码层面主要体现,并发设计,使用连接池,使用缓存,减少对磁盘数据的频繁读写等提高性能。

哇!这个回答太专业了。几乎涵盖了所有的情况。我在简单补充一下。对于程序级别的问题,通过可以通过线程dump和堆dump来看。如何获得线程dump和堆dump以及如何分析,在书中有详细的介绍。
其次,还可以通过如JProfile ,visualVM等工具,监控系统的行为,找到代码中的瓶颈。

论坛徽章:
0
6 [报告]
发表于 2012-10-24 19:33 |显示全部楼层
回复 17# laputa73


    是的,最根本的还是系统的整体结构和代码实现。如果系统整体实现有问题,JVM再怎么调整,也帮不上什么大忙。

论坛徽章:
0
7 [报告]
发表于 2012-10-25 17:36 |显示全部楼层
回复 21# lipiao123


    在本书里有这个例子,并进行了讨论。首先,书中给出的定义是:在极端情况下进行的优化方法。也就是说,你真的很重视这段代码的速度,并且CPU确实很慢。那么这种方式是有效果的。
   如果不是,那么这种展开会破坏代码可读性,是不可取的。而且,在现在CPU已经很强大的情况下,这种展开循环是没有意义的。但是,如果在嵌入式开发中,还是有一定的价值,因为前者要进行比较的次数远远大于后者。

论坛徽章:
0
8 [报告]
发表于 2012-10-25 18:51 |显示全部楼层
回复 23# billykinggym


    在补充一下。在JDK的较新的版本中,据说在JVM层会进行一次循环展开的。因此,直接展开这种循环,在高配置计算机已经新的JVM上没有太大意义。但对于J2ME或者Android等系统,还是很有用的。

论坛徽章:
0
9 [报告]
发表于 2012-10-28 10:51 |显示全部楼层
pitonas 发表于 2012-10-28 08:26
Java的性能不如人意


所以这不是需要优化吗?和C相比,可能是会稍微差点,但是这个也是要看情况的。Hadoop 也不是用java的嘛!这种云的东西都用java,所以也不会太离谱啦~

论坛徽章:
0
10 [报告]
发表于 2012-10-29 19:37 |显示全部楼层
回复 32# sinxadmin


    恩恩。学习了。这些JVM参数,在书里都有说明。不明白的可以看看~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP