[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!
[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!
[3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国*本,一律如此!
[4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和
其他类人物交往,如果你希望有朝一*当老板或高层管理,那么你整*面对的就是这些人。了解他们的经历,思维习惯,爱好,
学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!
[5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!
[6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞
开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!
[7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!
[8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!
[9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...
[10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!
如果看过yui-ext的例子,相信大家很想把它用在实际项目中去,我这两个星期都在研究它,国内几乎没有资料,只能从http://www.jackslocum.com的论坛找,我现在简单介绍一下我的实际开发环境:
我的项目原来的开发环境是Struts+Spring1.2.8+Hibernate3.1.2,现在要把页面的jsp+jstl,和Struts的Action转换成yui-ext的Ajax页面,简单实现数据列表、翻页和添加、修改、删除等功能。
1. 数据交换,要从Struts环境的Action通过request对象传递数据给jsp页面,如果用Ajax,比较常用的是XML转换和Json转换,我选择了Json,因为用json-lib包可以在java端用很方便的把对象转换成Json格式,在页面可以调用脚本eval()转换成javascript的数组对象。
1) json-lib转换java对象(下载json-lib:http://json-lib.sourceforge.net)
Action例子:(example.do)代码中加入:
response.setContentType("text/xml;charset=utf-8");
JSONArray jsonArray = JSONArray.fromObject(list);
response.getWriter().print("{datalist:" + jsonArray + "}");
return null;
简单说明:把action的return mapping改成null,因为现在使用response对象进行数据传递,fromObject(list)中的list包括就是页面需要调用显示的数据,可以是其他java对象,String、bean或Map。
2) JSONDataModel调用Action(example.do)
yui-ext通过JSONDataModel.js把json格式转换成javascript的数组对象
js例子:
var schema = {
root: 'datalist',
id: 'nothing',
fields: ['a','b', 'c', 'd']
dataModel= new YAHOO.ext.grid.JSONDataModel(schema);
dataModel.load('http://xxx/example.do');
说明:schema的root参数要和action传递的json数据头list对应,这里new JSONDataModel后,JSONDataModel会把example.do返回的json数据转换成dataModel的数组,JSONDataModel继承于LoadableDataModel,JSONDataModel只复杂转换json数据,其他由继承的类实现,这是yui-ext的特点,你可以自己写DataModel继承父类,转换自己的数据格式,yui-ext提供了JSONDataModel和XMLDataModel两种数据格式转换。
3) 使用grid显示dataModel数据
js例子:
var grid = new YAHOO.ext.grid.Grid('example-grid', dataModel, colModel);
grid.render();
jsp页面例子:
<div id="example-grid" style="border: 1px solid #cccccc; overflow: hidden; width: 535px; height: 225px;"></div>
说明:colModel的使用看example,grid绑定dataModel后,在页面的<Div>显示grid。
使用maven2一段时间了,我基本把我自己能够迁移的project都转换为maven2 project,以下是我的一点感想。
(原作者温少,转载请注明)
乱世盼英雄
现在的软件开发,比过去的软件开发要复杂得多。包括在参与开发的人数、代码规模、复杂的需求、依赖包的复杂性、使用到更多的技术、多个项目之间的复杂依赖关系。
现在的开发人员,要掌握的技术要比过去的开发人员要多,不是现在的开发人员比以前的开发人员本身更优秀,而是拥有更多的资料、更多的学习机会、更多更大规模的时间,同时软件行业也在发展。说一句题外话,老程序员,如果不与时俱进,靠老本,是无法和新一代程序员竞争的,当然,老程序员,拥有更多的经验,掌握新技术的速度更快,这又是另外一回事。
开发人员掌握的技术更复杂了,项目用得的技术自然也是更复杂,例如一个web项目,可能使用到很多技术,面向对象、泛型、or-mapping、依赖注入(spring-framework)、全文检索(lucene)、数据库、集群、工作流、web service等等。
由于使用了多种技术,这些技术可能是JDK提供的,也可能是第三方开源组织提供的,或者不同的商业公司提供的。
于是出现了一个新的难题,就是包依赖复杂性。以前,你很难想象你的代码依赖数十个不同开源组织、商业公司提供的库。例如,我们经常使用的log4j、junit、easymock、ibatis、springframework,每个组件都有悠久的历史,存在不同的版本,他们之间版本还有依赖关系。
项目依赖的复杂性,经常的,一个较大部门有10-30个项目是常事,项目之间有不同版本的依赖关系,部门与部门之间的项目也存在复杂的版本依赖关系。
Eclipse本身提供Project的依赖,但是简单的依赖显然解决不了问题。例如Project B依赖Project A,Project A依赖第三方的jar包abc-1.0.jar,那么需要在两个项目的lib下都存放abc-1.0.jar,这产生冗余,当Project数量多起来,这个冗余就产生了管理问题,如果需要将abc-1.0.jar升级为abc-1.1.jar,则需要在两个Project中同时修改,如果Project数量达到10个以上,而且是不同项目组维护的项目,这个就是非常麻烦的事情。而且Project A修改依赖,为啥需要Project B也作相应的修改呢?
需要解决此问题,就需要在Project A的包中描述其依赖库的信息,例如在META-INFO记录所以来的abc-1.0.jar等。Eclipse的plug-in拥有类似的方案,但是这样一来,就使得开发Project B的项目组,需要把Project A的代码从源代码库中check out出来。在依赖链末端的项目组是很惨的。
由于Project数量众多,关系复杂,dailybuild的ant脚本编写成了很麻烦的事情,使用Project依赖的方式,更加使得编写dailybuild ant script是非常痛苦的事情。
当然也可以不使用project依赖的方式,而使用artifact lib的依赖方式,但是artifact lib的依赖方式,就是同时修改多个project,互相调试时带来了痛苦。
在以前,我们面临这些问题时,唯一的感觉就是,这事情TMD的太麻烦,几乎是失控了。
maven的出现,解决这种问题看到了希望。maven出现的原因就是,现在的开发管理复杂度达到了一定程序,需要专门的开发管理工具,这样的工具需要涵盖开发的各个阶段,包括工程建立、配置依赖管理、编译、测试、产生分析报告、部署、产生制品等阶段。目前,各个阶段的工具都存在,但是不是集成的,对使用带来了很大麻烦。maven集成了这些工具,提高了统一的环境,使得使用更简单。
现在maven非常流行了,apache上所有java project都已经build by maven,其他跟进的开源项目非常多,例如mule、hibernat等等,商业公司也很多在采用,sun公司提供有maven2 repository。
现在,2007年,如果你还没采用maven project,你可能需要思考一下,是否你使用了不恰当的方式管理的代码,或者你落伍了?
maven的一些常用任务
compile 编译代码
test 运行单元测试
package 打包代码
site 产生报告,例如java doc、junit的通过率报告和覆盖率报告、findbugs的分析报告等等。
assembly 使用需求产生assembly,例如把生成一个程序目录,包括bin、config、lib、logs,把依赖包放在lib中。
deploy 部署制品到repository中。
这些都是常用的任务,在以前编写脚本很麻烦,现在在maven中,一切都是很简单,需要仔细设置时功能又强大到令人惊叹,例如site的fml,assembly。
maven资源库
maven官方提供了一个常用lib的资源库,包括apache的所有java项目,开源常用的基本都能够找到,例如mule、c3p0、easymock、hibernate、springframework、json等等,版本齐全,任你挑选。
可以部署本地资源库代理提高下载速度。使用maven proxy。
maven体系结构
maven使用plug-in的体系,使用很好的自动更新策略,本身用到的jar都是lazy download的,可以指定download的repository。这样,初始下载的maven是一个很小的程序,使用的时候从本地的资源库或者本地代理资源库高速下载lib。maven的插件体系,充分利用了internet的资源丰富和局域网的高速带宽,使用本地repository时,可以享受到每秒钟数M的下载速度,感觉就是,人生真是美妙!
elcipse的plug-in体系,就不是那么好用了,我们使用eclipse的find and install功能下载或者更新插件时,慢如蜗牛,依赖缺失时的烦恼,更新一个plug-in,可能耗费你数个小时,第三方的plug-in的下载服务器可能更慢,例如subversive的plugin-in,有一次我花了两天还没下载好,只好使用下载工具下载好,copy到plug-in目录下。此时,我们总是感叹,人生总是有很多烦恼事啊!
相比之下,高下立判!在此我不是说eclipse的plug-in体系结构设计不好,eclipse的插件体系非常优秀,但是还有很大改进空间!
个人体会:
IBM的WAS服务器使用难度上,也许比BEA的WLS服务器难10倍,学习成本很高,我05年末几乎花了两个月时间在它上面,天天研究那几本红皮书,测试。IBM的红皮书质量真的非常不错,但太多了。
WAS是定位在大型企业应用,集群系统。它的cell-->node-->server,profiles架构以及server上的cluster做得还挺强大的。但是,也许99%的用户都用不到,而且它的cell-->node-->server架构在WLS的domain-->server类似,但WLS非常易用。不过对于大型网站的前端http server,IBM自己加工的那个apache,和WAS配合还是挺好的。
在部署方面,WAS比WLS烦琐得多,虽然也支持命令行和自动部署,但比WLS难,因为发布一个app,大概要更新18个xml配置文件,n个步骤,手动更改配置文件几乎不现实,而WLS只需要把package丢过去就ok了,production环境下也只要控制台选择一下就ok了。在WAS下,我碰到一次是,集群同步时出错,下次几个server都启动不起来,手动修改serverindex.xml等相关文件才搞定,幸好那只是测试环境。
我用JProfiler监测WAS和WLS,WAS运行一段时间后,当时我那个环境启动了300多个thread,而WLS只启动50多个,而且WAS启动一般三分钟,而WLS可能半分钟。
另外,一般IBM的WAS运行在AIX、小型机环境下,而小型机的内存可能有个8G,这时候,最好是把WAS做成纵向分布式,也就是说,一个AIX上安装两个WAS。这个我当初也不明白,现在有体会了,因为这样比较好利用内存,因为JVM的heap设置过大并不好,很影响GC性能。还有,可能你的实际的应用怎么都不可能超过2G的heap。
给大家推荐几本WAS部分用到的IBM红皮书吧,他对我摆平我们这个大项目的WAS问题非常有帮助,我只推荐我仔细读过的、认为最值得看的,它们都可以在ibm红皮书网站下载:
《WebSphere Application Server V6 System Management & Configuration.pdf》:WAS教材
《WebSphere Application Server V6 Planning and Design WebSphere Handbook Series.pdf》:WAS教材高级版本,怎么去规划WAS。
《WebSphere Version 6 Web Services Handbook Development and Deployment.pdf》:Web Services教材,对Web Services本身讲解也很深入浅出。
《WebSphere Application Server V6 Security Handbook.pdf》:WAS安全必备书籍
《WebSphere Application Server V6 Problem Determination for Distributed Platforms.pdf》:WAS出问题了,看它吧。不过,这本书太初级,恐怕出了问题,它70%都不能帮你解决,还是去找IBM技术支持吧。
建议:WAS出问题了,一定要耐心研读红皮书,了解WAS的原理,盲目尝试往往都得不偿失,因为你做点改动,启动重启一次都要5分钟,重启20多次,一般一天时间就过去了,也就是说你只能知道有20个不行的尝试,但也许还有100个不行的尝试等着你,呵呵。总之,尝试你永远都不知道真正为什么会出错。
忘了,一定深入了解WAS里面的Classloader原理,这对你部署过程中出问题非常有帮助,譬如xml找不到,log打印不出来呀,我曾经也是饱受折磨。用好它,必须有深厚的理论基础,它不是给普通开发人员用的,反正我认为他的易用性是很失败的。
近段时间,我们项目中用到的WebSphere应用服务器(WAS),但在客户的production环境下极不稳定,经常宕机。给客户造成非常不好的影响,同时,也给项目组很大压力。为此,我们花了近一个月时间对其诊断,现在基本上稳定了,需要继续观察一段时间。现在我主要将工作做一个阶段性的总结。
我们的产品环境是:WAS6.0+DB2 8.1+AIX5.3+RS/6000。在该产品环境下,出现的问题非常多,现象如下:
WAS经常不稳定、宕机几乎一天一次,经常报告OutOfMemory(内存泄漏吗?NO)。
DB2连接数过大,有时把DB2撑死,有时也把AIX撑死。
AIX虚拟内存报错、分页报错、IO也报错、还有很多其它莫名奇妙的错。
总是,每次问题发生的现象和理论上的总是不一致,导致我们不知道从何入手,也无从检测自己的优化参数。咨询过多次IBM技术支持,只解决了某些局部问题。
虽然问题依然存在,但我想,解决问题的思路、特别是理论基础,还是有一些规律和原则。
对于WAS这块,我近段时间的主要时间集中在以下几个方面(时间顺序):
1、Java性能监测工具:Jprofiler,也用到Jprobe。后来发现Jprofiler在AIX下几乎不可用。
2、IBM Java虚拟机和WAS技术细节,特别是IBM JVM的GC原理,我发现它和sun、bea的差别很大。
3、IBM的heap分析器Heap Analyzer、GCCollector。这两个事后监测工具非常实用,特别是我们的产品运行环境,非测试环境。
4、某些Application的怀疑和诊断。
5、AIX诊断,我几乎没有这个能力,只能常规监测一下,需另请高人。
我打算将本文分成以下几个部分总结:
JVM原理、IBM JVM的GC策略和调优。
Jprofiler和IBM工具的实际体会
WAS的诊断体会和AIX调优
下面开始主题吧,可能比较零碎,另外,开始的理论篇基本上看书都可以,我只是总结一下,再添加一些自己的理解。
以下是我参考的最重要的两本电子书和一些网站:
《Inside Java Vrtual Machine》:半部分有约四章我认为非常棒,其它章节可能意义不大。
《The Java Virtual Machine Specification, 2nd》:前半部分有两三章很不错,不过可以对照上一本书看。
sun的hotspot虚拟机技术:http://java.sun.com/javase/technologies/hotspot/
BEA的JRockit虚拟机技术:http://edocs.bea.com/jrockit/geninfo/genintro/index.html JVM技术文档入口,虚拟机理论,内存泄漏诊断等的索引页。
IBM诊断资料:http://www-128.ibm.com/developerworks/java/jdk/diagnosis/ 上面有一个500多页的pdf文档,对IBM JVM技术和诊断讲解很深入。
我不得不提的是,在查资料这块,BEA和Sun都有很好的官方文档和论坛支持,并且官方文档导航非常好。虽然IBM的诊断资料也不少,但需要搜索,其搜索是很痛苦的。而且,IBM官方论坛很差。如果用IBM的产品出问题,切记:找IBM技术支持,千万不要蒙着头搞!反正它们的产品很少免费。说实话,它们的技术支持还是挺负责的,一般会为你推荐很多support资料,而该资料往往都在developerworks网站上,属于support那个频道,但你就是搜不着。
Java虚拟机规范概要
研究Java虚拟机,首先要了解Sun的Java虚拟机规范。现在,该实现版本很多,如比较有名的Sun、IBM、BEA、Apple、HP、MS、Apache Harmony。它们都实现了JVM规范,但有各自扩展。譬如,针对IBM虚拟机的堆碎片导致OutOfMemory(OOM),在Sun的虚拟机上就不会发生。Sun的JVM有maxPermSize的概念,IBM就没有,如果你设置这个参数,虚拟机根本就启动不了。
比较有意思的是,学Java,就一定要了解各种规范,这和MS的风格很不一样。Sun总是在定义一些规范,实现都留给各厂商。我们除了理解规范本身外,一定要理解规范和实现之间的关系,譬如JDBC规范和JDBC驱动的关系,它们是怎么组合到一起的。要是你用过php的xml解析库,或db函数,就会体会深刻,它们可没有什么规范可言,所以每个数据库厂商的db函数用法都不一样。我推荐大家研读一下HSQLDB的jdbc和Tomcat的servlet相关实现,因为我认为它们还是比较好懂的。
JVM规范只是定义一个虚拟机该做什么,但它并没有要求你该怎么做。例如我们最常见的Servlet规范,在该规范中,有HttpServletRequest、HttpServletResponse,HttpSession等接口,但它们的实现都留给了各个容器厂商。遗憾的是,规范留下的空白,会把我们这些开发人员给整惨了:容器间移植有时候就是恶梦。譬如J2EE并没有SSO规范,但它很重要,我以前专门针对它做过WebSphere AppServer和Weblogic AppServer的SSO项目,差别还是不小,不过还是有点共通,那就是都遵循JAAS规范。
JVM的结构
从功能上分,Java虚拟机主要由六个部分组成,可以分成三类:
第一类:JVM API:就是我们最常用的Java API,它是开发人员和Java交互的入口,它主要是JAVA_HOME/jre/lib下的运行时类库rt.jar和编译相关的tools.jar
第二类:JVM内部组件
类装载器(ClassLoader):将Byte Array的 .class文件装载、链接和初始化。
内存管理(Memory Managent):为对象分配内存,以及释放内存。后者就是垃圾回收Garbage Collector(GC)。由于JVM最复杂的、最影响性能的就是GC,所以内存管理一般就指垃圾回收。
诊断接口(Diagostics Interface):这主要体现在JVMTI(jdk1.4下的JVMPI和JVMDI),它主要用来诊断程序的问题和性能,一般提供给工具厂商实现。如eclispe IDE下的debug功能,Jprofiler性能调优工具。
类解释器(Interpreter):解释装载进虚拟机的class对象,包括JIT等特性相关。
第三类:平台相关接口(Platform Interface):主要为了跨操作系统平台重用JVM代码,不过,它和我们开发人员关系不大。
在以上六个组件中,我们开发人员最关心的是ClassLoader和GC,用Java做系统框架、容器和它们密切相关。做业务系统时一些基础代码也和它们打交道,譬如最常用的Class.forName(),Thread.currentThread.getContextClassLoader()。我们仔细想想,为什么是上面两个问题?因为,它和我们class的整个生命周期最为相关:怎么将一个class和相关class加载进来,class实例什么时候创建,什么时候被销毁?
所以,下面的部分我们要专门讨论这些问题。
ClassLoader
JVM主要有三类ClassLoader:Bootstrap、Extention、Application,该三类ClassLoader从上到下是分级(hierarchy)结构,遵循代理模型(Delegation Model)。
Tip:大家可以看看sun.misc.Launcher的源码,Bootstrap和Extention就在该文件里。该src可以在sun的网站上下载该压缩包,约60M(jdk-1_5_0-src-scsl.zip),它不在jdk自带的那个src.zip里。
Bootstrap ClassLoader:也称为primordial(root) class loader。主要是负责装载jre/lib下的jar文件,当然,你也可以通过-Xbootclasspath参数定义。该ClassLoader不能被Java代码实例化,因为它是JVM本身的一部分。
Extention ClassLoader:该ClassLoader是Bootstrap classLoader的子class loader。它主要负责加载jre/lib/ext/下的所有jar文件。只要jar包放置这个位置,就会被虚拟机加载。一个常见的、类似的问题是,你将mysql的低版本驱动不小心放置在这儿,但你的Web应用程序的lib下有一个新的jdbc驱动,但怎么都报错,譬如不支持JDBC2.0的DataSource,这时你就要当心你的新jdbc可能并没有被加载。这就是ClassLoader的delegate现象。常见的有log4j、common-log、dbcp会出现问题,因为它们很容易被人塞到这个ext目录,或是Tomcat下的common/lib目录。
Application ClassLoader:也称为System ClassLoaer。它负责加载CLASSPATH环境变量下的classes。缺省情况下,它是用户创建的任何ClassLoader的父ClassLoader,我们创建的standalone应用的main class缺省情况下也是由它加载(通过Thread.currentThread().getContextClassLoader()查看)。
我们实际开发中,用ClassLoader更多时候是用其加载classpath下的资源,特别是配置文件,如ClassLoader.getResource(),比FileInputStream直接。
ClassLoader是一种分级(hierarchy)的代理(delegation)模型。
Delegation:其实是Parent Delegation,当需要加载一个class时,当前线程的ClassLoader首先会将请求代理到其父classLoader,递归向上,如果该class已经被父classLoader加载,那么直接拿来用,譬如典型的ArrayList,它最终由Bootstrap ClassLoader加载。并且,每个ClassLoader只有一个父ClassLoader。
Class查找的位置和顺序依次是:Cache、parent、self。
Hierarchy:上面的delegation已经暗示了一种分级结构,同时它也说明:一个ClassLoader只能看到被它自己加载的classes,或是看到其父(parent) ClassLoader或祖先(ancestor) ClassLoader加载的Classes。
在一个单虚拟机环境下,标识一个类有两个因素:class的全路径名、该类的ClassLoader。
我碰到的一个典型的例子是:在做WAS的SSO开发时,由于我们的类是由WAS在启动时加载,该ClassLoader比下面的部署的Applicaton的ClassLoader的级别高。所以,在我们自己的类中没法用到应用程序的连接池,必须自建。
代理模型是Java安全模型的保证。譬如,我们自己写一个String.java,并且编译、package到自己的java.lang包下。按照代理模型,当前线程的ClassLoader会将其代理到父ClassLoader,父ClassLoader(最终会是Bootstrap)会找到rt.jar下的String.class,也就是说我们的String.class不会捣乱。
自定义ClassLoader
我们前面说过,自定义ClassLoader的缺省父ClassLoader是Application ClassLoader。一般的应用开发用不到它,但我们最好理解。因为在内存泄漏查找、应用程序部署出问题时,很多都和它有关。
譬如,内存泄漏是怎么产生的?这就涉及到ClassLoader和Class的生命周期。我曾经碰到这样一个问题:我们的程序用到了Webwork和Spring框架,当部署到Tomcat下时没有任何问题,但部署到WAS下,报告找不到Webwork的xml的DTD文件,而且Spring的日志也总是失效。Why?因为解析xml dtd时,用的是IBM的Xerces,不是我们的。而Spring日志问题是因为应用程序用的是WAS的Common-log.jar,而不是我们的。将应用的ClassLoader从默认的Parent-First,改成Parent-Last就可以解决,不过我们项目中用到其它库,又发生了其它问题。
一般来说,用到自定义ClassLoader有三种情况:
1、应用框架可以自己控制Classes的目录,并且自动部署。
我读过Jive公司的Wildfire(著名的即时通讯服务器),它自己有一套应用框架,非常灵活,遵循该框架插件规范的的第三方的plug-in放置在指定目录可以自动部署,实现某些扩展功能,如文件传输、语音聊天。
2、区分用户代码
这被广泛应用在Servlet容器和类似容器,譬如EJB Container设计中,大家看到Tomcat下有common、server、share三个目录吧(ClassLoader顺序从左到有),另外也有用户应用的WEB-INF目录,它是我们自己开发的。
3、允许Classes卸载
如果没有自定义的ClassLoader,那么我们自己应用中的classes永远都不能被卸载,因为这些类被Application ClassLoader加载后cache起来了,我们的classes一直对该ClassLoader有引用,而该系统级的ClassLoader永远都不会被卸载,除非JVM shutdown了。JSP和Servlet的动态部署就用到这个特性。
待续.......
Note: 还有JVM运行时(Runtime)架构,ClassLoader加载class过程没有总结,这两部分我觉得太重要了,但内容太多,写不完啊。
这部分内容,《Inside Java Virtual Machine》讲解非常清楚,BEA的官方网站这部分也非常不错,要理解深刻,我建议结合JProfiler工具,非常直观。
http://www.SQLSoft.com.cn 成立上线,欢迎IT人士加入
http://www.SQLSoft.com.cn 开源框架下载站
http://bbs.SQLSoft.com.cnjava开发者论坛
SQLSoft.com.cn 寻求资源合作
详细请联系:
msn:j.joy@msn.com
qq:269309672
AD:admission录取通知
Offer:奖学金,fellow,TA,RA,GA....有钱的
cong:congratulations!
gxgx:恭喜恭喜
3x:三颗伺。thanks!
RP:人品,research paper
PR: public relation
RL:recommendation letter
CV:Curriculum Vitae,和resume差不多。
CL:cover letter,checking list
MS:1、貌似的缩写 2、对Microsoft (微软)的称呼 3、ms=牧师 4、网络语:ms=没事 5、Multiple Sclerosis 多发性硬化6、【拉丁】科学学士 7、质谱分析法 8、manuscript 手稿
偶:我
kick your ass:踢你的PP
FT,分特:faint的简称,晕倒。
pat:代表安慰,拍头,这个也算GRE词汇吧,怎么还有人不知道?
momo:亲亲,么么
统一:刷墙,扫楼的同义词。也就是整个版面都是你的回复,一种被谴鸬男形!
XXXX的说:一种动词后置,比如吃饭的说
XXXXing:XXXX进行中,正在XXXX。比如上网ing
MM:妹妹
GG:哥哥
DD:弟弟
JJ:姐姐 鸡鸡
PLMM:漂亮美眉,浮云
XDJM:兄弟姐妹
PFPF:佩服佩服
PP:照片,但如果是说打PP,那就是kick your ass的意思了
BT:变态。和浮云的其他版块相比,水版是个BT出没的地方 扁他(她、它)
SL:色狼。浮云的特点是,狼多也MM多
BL:玻璃,不是指一种易碎品,而是同性恋
BC:白痴
YW:yangwei,不举
BD:笨-蛋
RY:人妖
LM:流氓
YY:意淫
PG:屁股
GF:girl friend,女友
BF:boy friend,男友
kao,靠,拷:粗口,慎用
MD:*的,粗口,特别慎用!
TMD:, *** ,粗口,特别慎用!
TNND:啊……那个……嗯……,粗口,特别慎用!
JJWW:唧唧歪歪,指人说话的样子
SJB:神经病
PMP:拍马屁
MPJ:马屁精
kick:扁
slap:打耳光
KH:葵花,就是练葵花宝典的高手,浮云某高手已练至化境,人皆不呼其名,而直呼K H。
KHBD:葵花宝典
PXJF:辟邪剑法,源于KHBD,KH专用的剑法
SM:Sadism & Masochism的缩写,性虐待或指(被)虐待狂
JS:奸商
SP:support,支持
的微:一种语气助词,KH专用
呼呼,猪猪:睡觉
稀饭:喜欢
果酱:过奖
BXCM:冰雪聪明
LOL:Laugh Out Loud,大笑
KFC:Kxxx & Fxxx & Cxx,要是和某人有仇,就KFC他吧
PK:player kill,砍人,攻击,也可解释为先批后K
btw:by the way,顺便说一句
PS:两种意思photoshop(一种电脑修图软件)or personal statement
p.s. = postscript not btw
CU:see you,再见
BB:宝贝,情人,孩子,byebye,看具体使用
走召弓虽:超强
满清:满清十大酷刑,老祖宗的玩艺
咔嚓:砍了,yan了
酱紫:这样
饭饭:吃饭
片片:照片
斑竹,板猪:版主,论坛版块的管理人员,把水版比作个小店,他们就是店小二。
水桶,水鬼,水仙,水王,水母:指灌水狂人,水母特制女性
水手:浮云水版的芸芸众生
潜水员:就是那些喜欢看别人灌水自己不灌水的家伙
恐龙:长得难看的MM
抓狂:受不了刺激而行为失常
THX,3X:thanks,谢谢
sigh:叹息
cool:酷
gay:同性恋,BL
fag:同性恋,BL
pm:论坛的私信
zip it:闭嘴
leecher:吸血鬼,指只知道索取不懂得分享回报的家伙,被严重鄙视的人
DL:download,下载
PUB:网路上扫描到的ftp,可以临时起上传下载功能,也指把文件传到pubftp上共享的行为。
BRB:Be right back,马上回来
TTYL:Talk to you later,再见,下次回头再谈
BBL:be back later 过会回来
R P W T:人品问题
PPL:people,人们
PLZ,PLS:please,请
bull ̄ ̄恩。。咳 ̄骂人的不是好孩子哦 ̄ ̄, ̄ ̄恩。。咳 ̄骂人的不是好孩子哦 ̄ ̄:胡说,废话
sorry ass:可怜的家伙,鄙视的意思
so so:一般
cutie:甜心
d\*amn:靠,他XX的
包子:某人长得难看或者笨就说他包子
粉:很,非常
菜鸟,小虾,初哥:就是初级水平的新人
老鸟,大虾:高手
木油:没有
蛋白质:BD+BC+SJB
爱老虎油:I love U,我爱你
倒:晕倒,厥倒
表:不要,比如表太好,不要太好的意思。
咣当:晕倒发出的声音
9494:就是就是
猪娃:CCF传过来的口语,好孩子
爆头:游戏中引来的词汇,把某人打得脑袋开花
4242:是啊是啊
7456:气死我了
748:去死吧
886,88:再见
847:别生气
987:就不去,就不去
874:狂扁图形(来自MOPSITE)
253:叩首图形(来自MOPSITE)
55555:哭
XXX:儿童不宜的东西
blah-blah:反复说
厚厚,吼吼,咔咔,kaka,嘻嘻,xixi:语气助词
猪头党,锄头党,仙族一派,神族,魔族,女子别动队。。:浮云水版的帮派组织
浮通社:浮云水版的新闻机构
五朵金花:翠花,如花,木花,黑花,菜花,水版的5个BT男
天外飞砖:某坛主两口子发明的一种极凶猛的暗器,据说让人生不如死
TNJJTDS:?你JJ?到死
灌水文章是指没有阅读价值的文章。典型的灌水方式:
1、一篇文顶、同意等等等寥寥数字,或者干脆没有内容。
2、所发文章与所在版块主题无关。
3、同一内容文章在同一版或不同版重复发表三次或者以上。
很多论坛专门设立了灌水区,供灌水爱好者发泄。灌水区也简称为“水区”
在非灌水区发表灌水文章首先先受到警告,劝阻无效者会受到封闭讨论权限以至取消会员资格的处理。有时候,一些人了会戏称自己所发的普通帖子为灌水。
ID,就是你在论坛所使用的用户名。
我只提供一个类似符号的解释,其他的大家自己勤劳点(其实是我找不到)
Orz (也可以写成Oro、Or2、On_、Otz、OTL、sto、Jto、○| ̄|_)是一种源自于日本的网络象形文字(或心情图示),并且在2004年时 在日本、中国与台湾俨然已经成为一种新兴的次文化。这个图示的意义是一个人面向左方、俯跪在地,在日文中原本的意义是“失意体前屈”,o代表这个人的头、 r代表手以及身体,z代表的是脚。人们在网络上,例如在电子邮件、IRC聊天室以及即时通讯软件中广泛使用这个符号,表现他们失意或沮丧的心情。而通常来 说,这个符号在口语中是被拼出的、而非唸成一个英文单字。
orz 这是小孩
OTZ 这是大人
or2 这是屁股特别翘的
Or2 这是头大身体小的翘屁股
orZ 这是下半身肥大
OTz 这是举重选手吧
○rz 这是大头
orz 这是黑人头先生
Xrz 这是刚被爆头完
6rz 这是魔人普乌
On 这是婴儿
crz 这是机车骑士
囧rz 这是念“窘”
崮rz 这是囧国国王
莔rz 这是囧国皇后.
商rz 这是戴斗笠的囧
st冏 楼上的他老婆吗
sto 换一边跪
Jquery是继prototype之后又一个优秀的Javascrīpt框架。对prototype我使用不多,简单了解过。但使用上jquery之后,马上被她的优雅吸引住了。有人使用这样的一比喻来比较prototype和jquery:prototype就像Java,而jquery就像ruby.实际上我比较喜欢java(少接触Ruby 罢了)但是jquery的简单的实用的确有相当大的吸引力啊!在项目里我把jquery作为自已唯一的框架类包。使用其间也有一点点心得,其实这些心得,在jquery的文档上面也可能有讲,不过还是记下来,以备忘罢。
一,找到你了!
还记得$()这个东西吧?prototype还是DWR都使用了这个函数代替document.getElementById()。没错,jquery也跟风了。为达到document.getElementById()的目的,jquery是这样写的:
代码
var someElement = $("#myId");
看起来比其他两个框架的要多了一个#,好,看看下面的用法:
代码
$("div p");(1)
$("div.container")(2)
$("div #msg");(3)
$("table a",context);(4)
在prototype里看过这样的写法吗?第一行代码得到所有<div>标签下的<p>元素。第二行代码得到class 为container的<div>元素,第三行代码得到<div>标签下面id为msg的元素。第四行代码得到context为上下文的table里面所有的连接元素。
如果你熟悉CSS,Xpath,你会觉得这些写法很眼熟!对了。正是。看出奥妙了吧。jquery就是通过这样的方式来找到Dom对象里面的元素。跟CSS的选择器相类似。
二,Jquery对象? jquery提供了很多便利的函数,如each(fn),但是使用这些函数的前提是:你使用的对象是Jquer对象。使一个Dom对象成为一个Jquery对象很简单,通过下面一些方式(只是一部分):
代码
var a = $("#cid");(1)
var b = $("<p>hello</p>");(2)
var c = document.createElement("table"); var tb = $(c);
三,代替body标签的onload 这个惯例,也许是除了$()之外,用得最多的地方了。下面一段代码:
代码
$(document).ready(function(){
alert("hello");
});(1)
<body onload="alert('hello');">(2)
上面两段代码是等价的。但代码1的好处是做到表现和逻辑分离。并且可以在不同的js文件中做相同的操作,即$(document).ready (fn)可以在一个页面中重复出现,而不会冲突。基本上Jqeury的很多plugin都是利用这个特性,正因为这个特性,多个plugin共同使用起来,在初始化时不会发生冲突。
不管怎么说,这个惯例可以分离javascrīpt与HTML。推荐使用。
四,事件机制 我大量使用的事件可能就是button的onclick了。以前习惯在input 元素上写onclick = "fn()",使用jquery可以使javascrīpt代码与html代码分离,保持HTML的清洁,还可以很轻松地绑定事件,甚至你可以不知道“事件”这个名词。
代码
$(document).ready(function(){
$("#clear").click(function(){
alert("i am about to clear the table");
});
$("form[0]").submit(validate);
});
function validate(){
//do some form validation
}
五,同一函数实现set&get 代码
$("#msg").html();
$("#msg").html("hello");
上面两行代码,调用了同样的函数。但结果却差别很大。
第一行是返回指定元素的HTML值,第二行则是将hello这串字符设置到指定元素中。jquery的函数大部分有这样的特性。
六,ajax 这是一个ajax横行的时代。多少人,了不了解ajax的都跟着用上一把。呵。使用jquery实现ajax同样简单异常
代码
$.get("search.do",{id:1},rend);
function rend(xml){
alert(xml);
} (1)
$.post("search.do",{id:1},rend);
function rend(xml){
alert(xml);
} (2)
$("#msg").ajaxStart(function(){
this.html("正在加载。。。。");
});(3)
$("#msg").ajaxSuccess(function(){
this.html("加载完成!");
});(4)
这些都是较常用的方法,get和post用法一样。第一个参数是异步请求的url,第二个为参数,第三个回调方法。
3,4的方法会在指定的Dom对象上绑定响应ajax执行的事件。当然,jquery的AJAX相关的函数不仅是这些,有兴趣可以去研究再多。
七,渐入淡出
代码
$("#msg").fadeIn("fast");
$("#msg").fadeOut("slow");
没错,上面两行代码已经分别实现了一个id为Msg的jquery对象的渐入和淡出。做一个像Gmail一样的动态加载通知条,用jquery就那么简单。两个函数接受的参数除了快慢等,还可以接收整型,作为渐入或淡出的完成时间,单位为MS。
八,plugin
这也是一个插件的时代。
jquery插件给我的感觉清一色的清洁,简单。如Jtip,要使用它的功能,只需要在你的元素的class上加上Jtip,并引入jtip.js及其样式即可以了。其他事情插件全包。我喜欢jquery的一个重要原因是发现她已经有了很多很好,很精彩的插件。
写得很烂。可能大家看不出jquery的好处。嗯,光听是没用的,试用一下吧。你会发觉很有趣。
暂时告一段落吧。待有新的发现再来分享。
加一些Jquery的资源:
http://www.visualjquery.com/index.xml 很好的API查询站点
http://jquery.com/demo/thickbox/ 知道lightBox吧,看看Jquery是怎样实现相同的东西
http://www.codylindley.com/blogstuff/js/jtip/ Jtip,实用的提示工具
http://jquery.com/plugins/ 很多牛的插件。
http://15daysofjquery.com/jquery 的15天教程
【CSDN 2007.5.29 译文】本文来自于Linux Community,作者试图解答下面的问题:
“有如此多的Linux版本可供下载、安装并完全免费使用的替换方案,为什么普通电脑用户仍然会选择花费几百美金去购买Windows或Mac操作系统呢”?
总的来说,并不是所有人都讨厌Windows的:普通用户每天在使用他们的Windows电脑时并没有遇到很多麻烦。
版本型号过多: 人们在面对Vista时只需考虑是选择家用基本版还是升级版,但普通的用户该如何在36种不同口味的Linux中做出选择呢?人们说“选择一个合适Linux版本的感觉,有点象一个没有经验的人来到了星巴克咖啡馆,你期望能够点一杯普通咖啡---但你会马上意识到生活并不是那么简单,你需要跑出长队并做大量的研究,然后再一次走到柜台前。”
人们需要确定的是硬件和软件都能很好的工作:“所有人在从Windows转到Linux时都需要从头开始考虑应用程序的问题... ...考虑每一个你所用应用程序的替代方案是一件很繁重的工作。”
至于大多数人所关心的,(Linux)命令行又走了恐龙式的复杂路线:它提供的功能更强大了,就象是Windows 的PowerShell(一种脚本技术),但是你确定普通用户也需要如此强大的功能吗?也许这对于系统管理员在维护服务器运行环境时会很有效,但普通用户甚至不需要知道它(命令行)的存在。
Linux桌面仍然很令人讨厌:但我认为这方面他们正在改进,Ubuntu桌面就比几年前的KDE或Gnome更加友好,再看Bery1桌面... ...确实令人惊讶!!但是我自己并非普通用户,我不认为我的律师朋友在写合同或文件的时候会发现它是实用的。
由于Mac的影响:想要追求与众不同的人会选用Mac,它建立在Unix之上,但是所有的复杂性都隐藏在性感的GUI和围绕它建立的封闭hw Apple背后。
谁来提供免费的技术支持?:大家会知道,周围人中“谁熟悉Windows系统”。在Mac系统下,这个问题更需要谨慎对待。但对于Linux,我真的怀疑象一个普通会计Jane,在她的朋友圈中是否会有人擅长Linux。
冷静下来,这仅仅是一个操作系统!:在Linux社区里充满了新潮的男孩,他们把这个开源操作系统看得太严肃了,这让人觉得充满了攻击性,并且有太多RTFM(指只要查阅文件就可以解决,拿出来提问只是浪费别人时间的问题)问题。这让人们远离了Linux。
我热爱Linux,我认为Beryl的桌面很好,强大的命令行功能很好,能够自由选择哪一个应用程序运行也很好,但是,就象我之前说的,我并不是一个普通用户,就象98%阅读我文章的读者(大多为Linux爱好者)一样。
普通用户可不愿意花费整晚的时间对着电脑研究它们(Linux),仅仅为了让它们能够正常运行。【翻译 付江】
在JavaOne会议上,Sun负责软件业务的执行副总裁格林公布了JavaFX Script:一种用于编写能够在支持Java的PC和手机上运行的应用软件的更简单的脚本语言。理查德表示,通过JavaFX Script和JavaFX Mobile,Sun和其它Java
在JavaOne会议上,Sun负责软件业务的执行副总裁格林公布了JavaFX Script:一种用于编写能够在支持Java的PC和手机上运行的应用软件的更简单的脚本语言。
JavaFX script构架图
为了解决手机的兼容性问题,格林详细阐述了JavaFX Mobile:一种面向手机厂商、提高Java应用软件在不同手机间兼容性的软件包。
Sun官员还计划发布最后一部分的开放源代码的Java,并阐述与Java相关的开放源代码项目的管理规则。
Sun计划通过JavaFX Script复兴Java在小型设备和浏览器上的使用。格林说,Java不仅仅面向企业,还面向消费者。我们即将发布的脚本语言将极大地增加能够为这一平台开发内容的人的数量。
JavaFX Script是一种在生产效率和易用性方面好于Java的脚本语言,能够与Java紧密集成。开发人员可以利用JavaFX Script编写能够在支持Java的PC和手机上运行的应用软件。
Sun希望扩大编写与Java兼容的应用软件的开发人员数量,并利用对所谓富互联网应用软件日益增长的兴趣赚钱。
格林说,Sun还在反对这一想法:即它在富互联网应用软件领域已经落后。RedMonk分析师斯蒂芬说,微软、Adobe、许多小公司都在挺进这一领域。
Sun计划发布JavaFX Script的源代码,让其它公司利用它开发Web创作工具。格林表示,Sun还计划开发用于内容创作的脚本工具。
随着Web开发人员开发包括从媒体发布站点到桌面风格应用软件在内的更复杂的网络应用,富互联网应用已经成为软件开发方面最热门的领域之一。
Burton Group分析师理查德说,Java有着庞大的产品和厂商产业链,但它在前端设计方面的应用受到了兼容性和性能问题的影响。JavaFX Script可能会解决这一问题。
据Sun称,利用Java平台开发在桌面系统上运行软件的编程人员已经达到了500万。格林说,全球已经有20亿部手机预装有名为Java ME的Java软件。
理查德表示,通过JavaFX Script和JavaFX Mobile,Sun和其它Java许可客户将拥有更有吸引力的富互联网应用软件开发工具。
在过去两年中,脚本语言在主流应用开发方面越来越流行了。许多Web网站开发者和企业开发人员已经选择脚本语言作为Java或.Net的轻量级替代者。
与Ruby、PHP、Python等相比,与Java有关的脚本语言的优势是,Java编程人员能够很方便地利用既有的编程技能。
利用JavaFX Script编写的应用软件能够在Java Runtime Environment上运行。格林说,与Adobe的Apollo一样,开发人员可以利用完全相同的工具编写基于Web浏览器的应用软件或跨平台的桌面软件。
尽管安装量非常大,不同Java ME实现之间的差异引起了兼容性问题。JavaFX Mobile面向手机运营商和厂商,能够减少这些差异,提供一系列用于完成常见任务的手机应用软件。
斯蒂芬表示,推出与Java有关的脚本语言不一定会让人们放弃Ruby、Python、PHP,JavaFX Script主要对已经在使用Java的开发人员有吸引力。
新闻链接:
JavaFX官方站点
了解JavaFX mobile
Sun Radically Simplifies Content Authoring - Previews JavaFX Script