我们的产品中使用到这个特性了,主要是加载Jboss的AOP,另外Oneal的单元测试使用到了这个特性,使用的是jmockit,然后在Javaeye看到一个文章谈到性能优化,使用的是jamon,developerworks上也有两篇文章( Java 5 特性 Instrumentation 实践和 Java SE 6 新特性: Instrumentation 新功能 ),需要好好关注下。
作者: 解惑/Cherami
原载: JDK5中没被重视的重要特性:instrumentation
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
其实就是使用了JDK的JPDA,在启动服务器(Jboss或者Tomcat等)的命令行参数里面加上:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
以Eclipse作为调试工具的话,创建一个Remote Java Application,连接参数填写正确的IP和端口(就是上面的8787)就行了
作者: 解惑/Cherami
原载: Java远程调试
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
最近遇到的,偶然间解决的,如果一些文件和目录已经被Workspace中的一个工程引用(即使是处于Close状态的),如果你另外的工程创建到那些文件的引用的时候会报错,你刷新的时候也会出问题。最简单的解决办法就是关闭其他的工程,需要的时候再打开。
作者: 解惑/Cherami
原载: Eclipse的一个问题
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
其实已经有很多文档了,不过还是老话,给自己备忘,总结些要注意的要点,给一些范例,以后肯定用得着。
以JK作为Apache和Tomcat的连接器,首先配置的是Apache的httpd.conf,主要是加载JK和配置转发规则:
加载和配置JK:
# Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so
# Where to find workers.properties
JkWorkersFile workers2.properties
# Where ...
在写代码的时候我们可能会需要当前的方法名,特别是在输出一些调试信息的时候,但是如果使用字符串硬写的话不太好,API好像也不带对应的功能,如果细心的话,异常信息里面是带出错的方法名的,我们可以dump stack trace并分析得到当前方法的方法名,实际上有更好的方法,和dump stack trace类似:
public static String getCurrentMethodName() {
StackTraceElement element=Thread.currentThread().getStackTrace()[3];
&nb ...
AOP绝对是个好东西,但是因为大部分的AOP实现都是通过修改字节码实现的,这就给Hot Deploy带来问题,在进行Hot Code Replace的时候JVM会抛错:Hot code replace failed - Hierarchy change not implemented,根据字面的意思,我猜测是JVM判断出原始的字节码有变化,但是JVM中的字节码是修改过的,类似子类的结构。目前还没有找到比较权威的解释,另外我对AOP也不是很熟悉,所以仅仅是猜测
作者: 解惑/Cherami
原载: 使用AOP带来的问题
版权所有。转载时必须以链接形式注明作者和原始出处及本声明 ...
也许有点老土了,但是这个插件确实是刚刚别人推荐给我的,而且很好用,特别是对于EJB开发之类的需要提供接口并实现的情况下,不用再自己去找实现类了。
感兴趣的自己去下载吧。
作者: 解惑/Cherami
原载: 推荐一个Eclipse插件:Implementors
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
这个是最近的工作成果,使用JBossCache作为Hibernate的二级缓存,因为JBossCache支持Transactional的缓存策略(Strategy),而且支持Cluster,Cluster还支持Invalidation的方式,比Replication方式更好,对两种方式同时支持同步和异步,还有其他很多特性,比OSCache好得多。
由于我们是把Hibernate作为服务配置的,所以CacheProviderClass使用的是org.jboss.hibernate.cache.DeployedTreeCacheProvider,需要另外一个MBean进行TreeCache的配置: ...
这个是进公司的第二个任务,由于是多个应用服务器集群,而产生pdf报表和发送邮件是通过JMS的异步方式,因此可能是服务器A产生PDF文件,而服务器B发送邮件,原来的实现是通过FileDataSource从本机取,因此有时候就不能成功发送邮件,后来修改为使用URLDataSource从自己写的一个Servlet取,但是很奇怪的是对于每个资源都会被请求三次,上网找了下,有个人也遇到同样的问题,但是他最后的解决方案不行,最后看了下URLDataSource的源代码(有兴趣的可以自己看看,注意getContentType和getInputStream的实现,每次都会开始一个新的请求),然后把URLDat ...
Java的功能在某些地方确实很有缺陷,File的delete方法就是一个很大的问题,如果文件被使用而不能删除,那么这个方法调用是不会抛出异常的,也不会返回任何信息,就像方法调用根本没有发生一样。由于是临时产生的文件,如果不能删除,那么文件越来越多就可能撑爆硬盘。
方法当然可以有一些,例如可以加一个线程不停的试,,删除不成功就等待一段时间,直到删除成功,这个方法应该是比较有效的,因为大部分情况下,文件只是临时被占用,可能前后就差那么几百毫秒,当然,这个方法不完美,还是可能有漏网之鱼,明天再好好想想方法了。
作者: 解惑/Cherami
原载: 文件删除不成功
版权所有。转载时 ...
前几天曾经抱怨新公司的开发环境太复杂,不能Hot Deploy,极其影响开发的效率,今天成功的在Eclipse(实际上是MyEclipse)中配置好了可以Hot Deploy的环境,其实也很简单,我们的工程发布非常的复杂,sar, ear, har, jar, war一个套一个,要想严格的按照那个目录结果配置工程几乎不可能,但是要想Hot Deploy很简单,配置一个Web工程,引入全部的工程需要的类,把Jar包修改为手工发布,然后使用MyEclipse的Manage Deployment发布,只要你的这个web工程先于原来的工程发布就行了,对于同名的类,由于新的工程先加载,所以也就可以达到H ...
相信很多人在面试的时候都会被问到JSP和Servlet的区别,我认为JSP就是功能受限的Servlet,因为JSP不能作为后台的控制Servlet用,但是实际上我的这个想法是错误的,JSP是可以像普通的Serlvet那样作为控制用的Servlet用的,在web.xml里面定义一下就行了:
<servlet>
<servlet-name>control</servlet-name>
&n ...
看了新公司的发布目录,感叹公司把Java相关的发布包用得出神入化,从最简单的Jar到最常见的War,以及中大型J2EE工程中的Ear,然后是JBoss特定的Sar,以及被Jboss收购后的Hibernate提供的Har,真的是被AR搞混头了,特此列举一下:
JAR:java类文件的打包发布
WAR:WEB应用的打包发布
EAR:J2EE应用的打包发布,一般包括EJB
SAR:JBoss的Service打包发布
HAR:Hibernate打包发布
作者: 解惑/Cherami
原载: AR何其多
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Jav ...
今天总算是把工程在Eclipse下配置好了,而且没有任何错误,从Oneal那里拷贝来的工程文件一堆错误,我这个人又是那种容不得满眼全是错误的人,花了一个小时搞定这个问题,开始熟悉项目,结果是:真是太复杂了!
系统的大部分都是通过Web Service调用的,包括和其他的系统集成以及和工作流引擎集成,而Web Service又是通过Session Bean调用DAO,DAO再调用hibernate,而Session Bean用到了版本2和版本3(也就是同时使用了EJB2和EJB3),因此工程有N个EJB的模块,源代码也分布在几十个大大小小的目录中,同时Web工程也是N个模块,另外还使用到了LDA ...
Lucene Hack之通过缩小搜索结果集来提升性能 (1)
(tags: lucene 性能 搜索)
作者: 解惑/Cherami
原载: links for 2007-05-12
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
我们的系统还使用古老的Ant1.5作为构建工具,而且做了一些定制(可能修改了部分源代码),我们就不能随便升级到高版本,而Ant1.5的那个Junit的task比较旧,运行每个TestCase的时候都是重新开一个新的VM,而我们的单元测试框架要读取很多EJB配置文件完成初始化,如果每个TestCase都去解析那些文件就太慢了,每个TestCase至少需要10秒,所以没有办法,我就把所有的Case都手工加到一个TestSuite,然后运行那个Suite,这样就不会重复解析那些文件了。但是手工把那些Case加到Suite里面也是很痛苦的事情,就想到把那些解析的结果缓存下来,最先想到的当然是序列化了, ...
今天早上来更新了下代码,发现自己负责的和Crystal Report集成的代码突然不能工作了,刚好昨天升级了Crystal Report,而我们明天早上就要做演示的,天啊。
不过好在我是一个经验丰富的老鸟了,这点事情还不至于让我手忙脚乱,看了下控制台,没有异常信息,在关键代码的地方设置了断点,跟踪了下,发现原来工作的一个Query不能工作了,但是异常被截获并忽略了,把异常信息打出来,报的信息是查询无法识别,我没有修改过啊,而且这个查询是提交到Crystal Report Server的,那个Server并没有升级啊,再仔细一看,原来是我的查询被修改了,加了一个/*ARQXXXXX*/的注释,呵 ...
对于大部分应用而言,数据库可移植性可能不太重要,而一些完全使用ORM的应用可能也问题不大,但是一旦需求来了,它就变得非常的重要,现在我们就遇到了这样的需求。
我们原来一直使用Oracle,也从来没有想到要更换数据库类型,所以我们一直心安理得的使用各种Oracle优化技巧来优化我们的SQL(我们的系统的性能要求也比较高),现在有个新客户,要求使用SQL Server,这下就麻烦大了,初步估计需要5000个小时!
这个变化也影响到我们做的水晶报表,原来没有考虑数据库迁移,所以选择数据库连接的时候直接选择的就是Oracle服务器,而不是建一个ODBC的数据源,而水晶报表的数据库配置是不能随便修改的, ...
感觉原来的几个Java社区日益没落,当然这个和Java世界的消沉有很大关系,这两年已经看不到什么大的Java新闻了,特别是对于Java开发人员而言的大新闻,原来Spring带来的各种火热的讨论也已经沉寂下来,Java世界似乎已经毫无新意了,现有的任何Java开源产品或者组件所能够带来的开发效率的提升都无法和新的脚本语言匹敌(我想这也是为什么JavaEye会使用RoR重写的一个重要原因,同时也是Robin转向研究Ruby的重要原因),在可以预见的一段时间以内,都不太可能出现一颗真正的银弹。但是我对于Java并没有丧失信心,因为Java依然拥有广大的开发人员以及丰富的开源产品和组件,现在所缺少的是 ...
呵呵,意犹未尽,继续批驳。
banq先生对自己的思维和真正想法并不是了然于胸,我想他不关心的是业务逻辑的实现了,他说他已经很多年不去翻J2SE了,那是因为他已经很多年不是“程序员”了,他不需要使用他的框架去完成一个实际的业务系统,你把这个框架做了,你鼓动别人去使用框架,去学习设计,还有意义吗?如果别人都去提高学习了,都去设计了,就不会有人用他的框架,而如果别人都不用,那他搞那个框架又是为了什么呢?
他说他自己对J2SE都忘记了,那么他是如何完成这个基于Java的框架的?难到都是拷贝别人的代码,然后就是debug?
再说他所谓的向上思维和向下思维,其实不是思维问题,而是开 ...
呵呵,看到JDon上正在讨论j2se基础的重要性,忍不住也来说两句,可以这么说,我是完全反对banq的说法的。
我不知道banq的功底到底如何,但是对于指导初学者,我觉得他完全不合格。
编程,在大多数情况下是简单的,这个可以从印度大量使用高中生编程照样可以开发出稳定大型的系统可以看出来,而且以我的经验来看,做对日外包也是一样,因为他们的设计文档已经写得足够的详细,他们提供的底层框架已经足够傻瓜(和设计文档相配合),在这种情况下,编程并不需要太多的技能,显现水平的方式就是对框架API和底层API的熟练程度,熟悉了那些API差不多就可以了(而且本来就有详细的API文档),只要可以编译通过,基本上就 ...
按照原先的计划,这个系列只应该有四篇,但是后来打算多写一些,把这个问题研究透彻,所以出现了总结篇先于其它篇的情况。
这次我们按照总结篇中提到的方法实际演示下代码覆盖工具如何帮助我们优化程序提高性能,先给出我们未经好好优化的程序:
package com.jiehoo.util;
public class GoogleFn {
private static final int MAX = 2600002;
private static long start = System.currentTimeMillis();
&n ...
上次已经说了fn的实现不能用来查找符合条件的n,因为这样做比前面的第一个例子中的性能比较差的那个还要差,原因就是有太多的重复计算,如果只是计算一个指定的数的结果,那么那个实现是无与匹敌的。但是我们是讲的性能优化,所以,我们就用它来做,放慢速度,然后使用其它的技巧来提高性能,这次的方法就是简单的使用缓存:
public class GoogleFn {
private static final int MAX = 2600002;
private static long start = System.currentTim ...
其实很多问题一旦涉及到数学问题或者数据处理密集型问题,那么最终显现神威的就是数学公式,这个面试题也是这类问题,所以如果我们能够推导出一个数学公式就是最理想的,在前面的例子中,我们进行了一些深入的分析,根据前面的例子,你可能会尝试把步长从100扩展到1000或者10000,但是实际上这个方法遇到了瓶颈,因为循环嵌套的层次太多,计算公式太复杂也会导致问题。如果我们最开始尝试的时候把全部的f(n)的结果打印出来,你会发现这样的内容:
f(9) = 1
f(99) = 20
f(999) = 300
f(9999) = 4000
……
这个是我们的第一个规律:位数乘以((位 ...
在例子四的基础上,我们可以进行更加深入的分析,我们还是以100为例,我们其实在大部分情况下可以省略循环,如果数字的百位数以上包含1的个数为0,而十位数不为1,那么当个位数大于1以后,我们可以中断底层的循环,这样我们又节省了很多的运算:
public class GoogleFn {
private static int MAX = 1320000000;
private static int MAX2 = MAX / 10;
private static int MAX3 = MAX2 / 10;
private static int c ...
呵呵,说了这么多,到底怎么优化性能还是没有说多少,而且一个产品的代码比这个例子复杂得多,怎么才能优化产品代码呢?
很简单,找到性能瓶颈,而大部分的性能瓶颈都有一个特点:被执行的次数太多。一个耗时2分钟的操作,如果系统运行一天才需要运行一次,那么我们根本就不要去理会它,如果一个操作耗时2秒,但是一般运行一天它要被执行几千亿次,那么你就要小心了。
如何才能知道系统中的哪些代码被执行的次数最多呢?有很多工具可以,有的是挂到系统上一起运行,有的是可以单独运行,但是我推荐的方法就是使用单元测试工具和代码覆盖工具,运行所有的单元测试,查看代码覆盖报告中被执行的次数最多的那些语句,看看他们是否可以被优化,或 ...
其实在例子二的基础上,我们进一步的分析,可以把缓存10个结果换成缓存100个结果,性能可以得到进一步提升:
public class GoogleFn {
private static int MAX = 13200000;
private static int MAX2 = MAX / 10;
private static int MAX3 = MAX2 / 10;
private static int count(int n) {
int count = 0;
...
对于任何语言来讲,循环永远是非分布式系统的性能的最大杀手,循环中的任何一个简单的语句对性能都是有影响的,只是影响的大小不同而已。第一个例子中的影响是比较大的,不同的实现方法的时间开销不同,然后这个微小的差异被循环次数放大后就非常的明显(3倍),而第二个例子,其本质是减少了循环执行的次数,虽然总的循环次数是一样的,但是最耗时的操作的执行次数被减少到1/10,所以产生的差异是非常巨大的(8倍)。我们再来看一个很不起眼的微小差异带来的影响:
public class GoogleFn {
private static int MAX = 132000000;
& ...
对于任何语言来讲,循环永远是非分布式系统的性能的最大杀手,循环中的任何一个简单的语句对性能都是有影响的,只是影响的大小不同而已。第一个例子中的影响是比较大的,不同的实现方法的时间开销不同,然后这个微小的差异被循环次数放大后就非常的明显(3倍),而第二个例子,其本质是减少了循环执行的次数,虽然总的循环次数是一样的,但是最耗时的操作的执行次数被减少到1/10,所以产生的差异是非常巨大的(8倍)。我们再来看一个很不起眼的微小差异带来的影响:
public class GoogleFn {
private static int MAX = 132000000;
& ...
前面我们已经说了字符串运算和数学运算对性能的巨大影响,接下来我们看看分析程序,多思考给我们带来的好处。
如果我们做一个简单的分析就可以知道,在尾数从0到9的连续十个数字中,只有尾数为1的数字的1的个数比其它的数字多,那么我们可以以10个数为单位进行分隔,计算尾数为0的数字包含1的个数,其它的9个值就以此为基础计算:
public class GoogleFn {
private static int MAX = 13200000;
private static int MAX2 = MAX / 10;
&n ...
- 浏览: 75959 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
链接
最新评论
-
Google面试题解说性能之八 ...
引用使用单元测试工具和代码覆盖工具能分享这两个是什么工具吗
-- by jiazhigang -
Google面试题解说性能之一 ...
的确String.valueOf()的效率最高
-- by morfil -
得到当前方法
上面的Thread的getStackTrace()方法只在1.5中才被加入
-- by litchi -
Google面试题解说性能之总 ...
...
-- by orc_chan -
Google面试题解说性能之总 ...
...
-- by orc_chan






评论排行榜