??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲中文无码永久免,亚洲人成图片网站,jlzzjlzz亚洲jzjzjzhttp://www.tkk7.com/flyffa/category/14439.htmlzh-cnWed, 28 Feb 2007 04:09:47 GMTWed, 28 Feb 2007 04:09:47 GMT60【读书】jsp高~程-jsptaglibhttp://www.tkk7.com/flyffa/archive/2006/08/24/65580.htmlflyffaflyffaThu, 24 Aug 2006 09:15:00 GMThttp://www.tkk7.com/flyffa/archive/2006/08/24/65580.htmlhttp://www.tkk7.com/flyffa/comments/65580.htmlhttp://www.tkk7.com/flyffa/archive/2006/08/24/65580.html#Feedback0http://www.tkk7.com/flyffa/comments/commentRss/65580.htmlhttp://www.tkk7.com/flyffa/services/trackbacks/65580.html阅读全文

flyffa 2006-08-24 17:15 发表评论
]]>
【读书】jsp高~程-j2eehttp://www.tkk7.com/flyffa/archive/2006/08/24/65579.htmlflyffaflyffaThu, 24 Aug 2006 09:13:00 GMThttp://www.tkk7.com/flyffa/archive/2006/08/24/65579.htmlhttp://www.tkk7.com/flyffa/comments/65579.htmlhttp://www.tkk7.com/flyffa/archive/2006/08/24/65579.html#Feedback0http://www.tkk7.com/flyffa/comments/commentRss/65579.htmlhttp://www.tkk7.com/flyffa/services/trackbacks/65579.html2004-12-03

W一部分QJSP和J2EE
1?什么是javabean
javabean的属性分为四c:
1、simpleQ简单属?br />propName
getter:getpropName()
setter:setpropName()

2、IndexQ烦引属?br />propName
getter:[] getpropName()
setter:setpropName()
getterI: obj getpropName(int i)
setterI: setpropName(int i,obj)

3、boundQ触发propertychange事g的属?br />接口和普通属性没有什么不同,只是在setter里支持触发事件propertychange.

4、constrainedQ限制类属?br />接口和普通属性一_setter支持bound,另外Q?br />在setter中支持触发事件让相关监听lg来判断是否可以设|,如果不行Q其他组件会抛出propertyvetoException

事g模型Q?br />Z源和listener的的事g模型。observer模式?br />事gQjava.util.EventObject及其子类?br />监听者:java.util.EventListener及其子类?br />源对象:接口必须标准
public void add< ListenerType>(< ListenerType> listener)
public void remove< ListenerType>(< ListenerType> listener)

事g适配器:
可以用作定会做出反映的事g响应者的用途?/p>

2、在jsp中?br />

3、jsp中javabean的scope
application scope:应用E序U别的?br />session scope:会话U别
request scope:hU别
page scopeQ页面?/p>

1? ejb
Ҏ的面向服务器端的javabeans.
包含sessionbean和entitybean两种
home
Home 接口定义了创建查扑ֈ除EJB q程接口对象或者EJB 服务的方法客L
应用E序通过使用JNDI 技术定位Home 接口的位|一旦获得Home 接口的实例就可以
利用它的create()Ҏ创徏EJB q程接口的实例对?br />remote接口
q程调用接口 (或者简UCؓq程接口Remote Interface)是对EJB 对象Ҏ的d?br />在远E调用接口中声明了EJB 对象的方法但是ƈ没有具体实现q些Ҏ?setproperty id="Name" property="*">

3、jsp中javabean的scope
application scope:应用E序U别的?br />session scope:会话U别
request scope:hU别
page scopeQ页面?/p>

1? ejb
Ҏ的面向服务器端的javabeans.
包含sessionbean和entitybean两种
home
Home 接口定义了创建查扑ֈ除EJB q程接口对象或者EJB 服务的方法客L
应用E序通过使用JNDI 技术定位Home 接口的位|一旦获得Home 接口的实例就可以
利用它的create()Ҏ创徏EJB q程接口的实例对?br />remote接口
q程调用接口 (或者简UCؓq程接口Remote Interface)是对EJB 对象Ҏ的d?br />在远E调用接口中声明了EJB 对象的方法但是ƈ没有具体实现q些Ҏ?/p>



flyffa 2006-08-24 17:13 发表评论
]]>
【读书】设计模?行ؓ型模?/title><link>http://www.tkk7.com/flyffa/archive/2006/08/24/65576.html</link><dc:creator>flyffa</dc:creator><author>flyffa</author><pubDate>Thu, 24 Aug 2006 09:10:00 GMT</pubDate><guid>http://www.tkk7.com/flyffa/archive/2006/08/24/65576.html</guid><wfw:comment>http://www.tkk7.com/flyffa/comments/65576.html</wfw:comment><comments>http://www.tkk7.com/flyffa/archive/2006/08/24/65576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flyffa/comments/commentRss/65576.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flyffa/services/trackbacks/65576.html</trackback:ping><description><![CDATA[ <p>2004-08-31</p> <p>构徏型模式和l构型模式强调的都是静态的cd体之间的关系Q行为型模式着力解决的是类实体之间的通讯关系。希望以面向对象的方式描qC个控制流E?br />以往的经历中大多是解决类实体的封装问题,对于cM间的通讯方式上,q没有刻意的ȝ解,所以有些行为型模式相对陌生?br />q有一个原因就是行为型模式和面向过E的东西有很多近g处,D一定的理解的؜淆?br />从笔记就可以看出理解的不够,可以再专门针对行为型模式做些l节的学习?/p> <p>1 chain of responsibility(职责?Q行为型对象模式<br />q是个“请求”处理的模式。他提供一个思\Q来解决“请求”在一l具有一定结构的cM间传递时的问题,所以,我认只是一U思\Q一U将“请求”象链条一样传导出ȝ方式。他的具体传递方式,除了和链的设计有关之外,最重要的是和对象组的结构有兟?br />当然Q如果没有结构的对象l,我们也可以强行的动态构Z个链Q这U方式虽然复杂和略土Q但肯定更加的灵z,不仅能控制处理,q能控制铄走向?/p> <p>一般来看,composite模式和这U模式经常在一PMicrosoft IE中的文档事g模型应该采用的就是这L模式?/p> <p>2 command(命o)Q行为型对象模式<br />请求封装ؓ一个对象,从而可以对h做一些统一性处理,如:排队、日志、撤销{?br />适用性:<br />1、是回调机制的一个面向对象的替代?br />2、在不同时期指定、排列、和执行h<br />3、支持取消操作,但是Q此处对象的状态存储是个麻烦的东西?br />4、支持原语操作上构徏高层操作的系l。这U在支持“事务”的pȝ中很常见?br />理解q是不很透彻</p> <p>3、Iterator(q代?Q行为型对象模式<br />聚合类的遍历算法封装ؓIterator,从而封装对象的内部表示?br />Iterator分ؓ外部和内部,外部更加灉|Q内部传入参数简单(只需要操作)Q内部Iterator自动遍历所有元素?br />Iterator可以装法Q也可以只记录状态,p合类装法Q封装算法的iterator可能会破坏聚合类的封装性?/p> <p>4、mediator(中介?<br />mediator希望通过一个中控对象来完成对多个对象的关系的管理?br />多数可以可以重用的lg无关联的构徏hQ而他们之间的关系由额外的对象来完成?br />在图形化~程里,可以用此模式和listener机制(observer模式)l合使用Q更加方便,q一步解除了中控对象与其他对象的耦合?/p> <p>5、memento(备忘?/token<br />原发?originator)(需要保存状态的)甌一个备忘录QmementoQ,q自己将状态保存进去,然后Q将备忘录交l管理?caretaker),当出现需要的时候,理者将合适的备忘录交l原发器Q原发器自己恢复自己?br />状态?br />memento模式Q从originator中分M保存客户h状态的q程。ƈ且memento的存储和解释都是由originator完成Q保证了装的边界?br />如果备忘录的创徏及其q回Q给原发器)的顺序是可预的Q备忘录可以存储增量改变?/p> <p>6、observer(观察?/依赖(dependents)/发布-订阅(Publish-Subject)<br />suject(目标)和observer(观察?是关键对象,suject和不固定的observer发生关系Q将q种关系解耦是q个模式的主要功能,listener机制可以看作q种模式的一个实玎ͼ当然mvc也是q种模式的一个好的应用场景?br />与mediator的区别主要体现在Qobserver是一个对兌关系的解耦过E,而mediator更加注重各个对象执行的功能?/p> <p>7、state(状?/状态对象(Objects for StatusQ?br />允许一个对象在改变其状态的时候改变它的行为,使得对象g修改了自qcR?br />1、将状态相关的行ؓ局部化?br />2、状态{换显式化</p> <p>我们可以Ҏ当前H口的状态来转变H口的菜单和操作Q这U方式可以用state模式来实现?/p> <p>8、strategy({略)<br />算法单独的装hQ得它独立于其他对象的变化?br />其实q种方式和面向过E里的一个算法函数封装基本是一LQ只是由于封装成Zc,会有一些接口统一的便于替换的Ҏ?/p> <p>9、visitor(讉K?<br />q种模式的主要目的是分离操作和对象,q求的是对象的重用和单,以及操作的可替代性?br />相对来说Qstrategy模式更加q求的是装操作Q追求操作的重用性?br />observer、mediatorq求分离对象之间的关pM对象本n?/p> <p> <br />以上都是对象U别的行为模式,以下是类U别的行为模?br />1、template(模板)<br />定义一个算法的骨架Qƈ其中一些步骤gq到子类中?br />q种使用较多Q不多说了?/p> <p>2、interpreter(解释?<br />本模式描qC如何为简单的语言定义一个文法,如何在该语言中表CZ个句子,以及如何解释q些句子?br />q种方式在正则表辑ּ中比较明显,在以往的程序应用中Q特别是上层应用中很用到?br />expression::= literal | alternation | sequence | repetition | '(' expression ')'<br />alternation ::= expression '|' expression<br />sequence ::= expression '&' expression<br />repetition ::= expression '*'<br />literal ::= 'a'|'b'|...{'a'|'b'|...}*</p> <p>相关的关键参与者ؓQ?br />1、abstractExpression(抽象表达式,l一的接?<br />2、terminalExpression(l结W表辑ּ)<br />3、nonterminalExpression(非终l符表达?<br /></p> <img src ="http://www.tkk7.com/flyffa/aggbug/65576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flyffa/" target="_blank">flyffa</a> 2006-08-24 17:10 <a href="http://www.tkk7.com/flyffa/archive/2006/08/24/65576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书】设计模式-l构型模?/title><link>http://www.tkk7.com/flyffa/archive/2006/08/24/65574.html</link><dc:creator>flyffa</dc:creator><author>flyffa</author><pubDate>Thu, 24 Aug 2006 09:09:00 GMT</pubDate><guid>http://www.tkk7.com/flyffa/archive/2006/08/24/65574.html</guid><wfw:comment>http://www.tkk7.com/flyffa/comments/65574.html</wfw:comment><comments>http://www.tkk7.com/flyffa/archive/2006/08/24/65574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flyffa/comments/commentRss/65574.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flyffa/services/trackbacks/65574.html</trackback:ping><description><![CDATA[ <p>2004-08-30</p> <p>l构型模式:描述的是一pd类和对象进行组合,以构建更大的cd对象。其的是l构化的方式Q而不是怎样L造这些类?/p> <p>l构型模式分ZU:<br />a、结构型cL式:通过接口或类的承来实现?br />b、结构型对象模式Q不是对cL接口Q而是对对象进行组合?/p> <p>/*****************************************************************************************/<br />1、Adapter(适配?/wrapper(包装?<br />适配模式最重要的作用是d已有的、但是接口不兼容的东西接入到pȝ中来。进行复杂逻辑E序的有效重用?br />q个模式中adaptor,adaptee的基cLh惟一性的?/p> <p>a、类适配<br />c适配是通过l承q种静态的方式来进行适配Q也是适配器会l承需要被适配的东西,<br />~点是适配的范围比较小Q不能满_旉配一l对象(cd其子c)的要求?/p> <p>b、对象适配<br />对象适配Q适配器ƈ不会静态的l承Q而会是采用引用需要被适配cȝ方式Q这P被适配cd其子c都可以被适配了,<br />~点Q需要动态的指定被适配对象Q而且Ҏ引vq行期错?/p> <p> <br />注:可能是对于其他面向对象语a的不了解Q我觉得用对象适配可以了Q没有必要用类适配的模式,对于只有一个需要适配的类的情况,我们只需要将动态构造引用对象的q程加在适配器的构造函C可以了Q在今后对其他类型的OO语言有了了解之后Q可以再回顾一下此处?/p> <p> <br />/*****************************************************************************************/<br />2、bridge(桥接)/(Handle/boby)Q-Q结构型对象模式<br />桥接的模式最重要的作用是抽?表现与实现相分离Q保持程序良好的可扩展性?br />q个模式中window和windowimplq两个接口是h惟一性的?/p> <p>一个一般的l承模式的设?br />window--xwindow<br /> pmwindow<br /> iconwindow--pmiconwindow<br />      xiconwindow<br />q种树状的承方式将抽象的表现部分iconwindow和抽象的实现部分(xwindow,pmwindow)集成C一赗?br />而这两者其实负责不同的东西Q一是表?外部特征Q如icon是可以拖拽的Q是q形组成的{等)Q二是具体实现^収ͼ负责在xwindow风格下的U如何画Q线有多_,从什么位|开始画{等?/p> <p>于是应该有着两条U的l构Q?br />window--iconwindow<br /> applicationwindow</p> <p>windowimpl--xwindow<br />     pmwindow</p> <p>中间通过window对windowimpl的引用来辑ֈ桥接的作用,也就是说Q桥接的奥秘在于此Q合理的这两者的接口q行分离Q是桥接模式设计的关键?/p> <p>桥接方式的退化Ş式就是我们只是需要实现xwindow或者pmwindow中的一U,q样windowimpl失L义了。(对于有些语言Qwindowimpl的存在可能有利于实现的改变不需要重新编译客户应用程序)   </p> <p>/*****************************************************************************************/<br />3、composite(l合)Q-Q结构型对象模式<br />l合模式使得单个对象和组合对象的使用h一致性。得对外提供的接口变得单一Q用户忽略单个对象与l合对象的差异?br />l合模式着力于解决q样一个矛盾:<br />在一个程序组中有着层次的关p,需要表玎ͼq是一个内部重用性和易读性的问题Q?br />但是q个E序l中的对象有着共性,q且希望外部调用E序忽视其各异性而只是关注其共性的部分Q这是一个外部接口简单化的问题)?br />所以其主要元素的关pd是这样了Q?/p> <p>composite(复合对象)-leaf(单对?<br />      composite(复合对象)-leaf(单对?<br />     leaf(单对?</p> <p>而这些对象实现统一的接口或者抽象类QcompositeInterface;Mclient对Q何对象实例的操作都是通过接口q行?/p> <p>模式的实玎ͼ<br />在实C会有一pd的问题,q只是实现的问题Q和模式本n无关?br />1、显C父对象引用Q解x法:建立一个稳定,模式化的父子引用关系和操作方法?br />2、共享组Ӟq将父子之间?QN的关pd成了NQN的模式,参考flyweight模式?br />3、最大化component接口Q这是保证操作透明化的必须Q我们应该尽力达到这个目的?br />4、声明管理子部g的操作:q个问题最大的ȝ来源于子部g和父部g最大的差异Q-有没有子节点Q可以通过l一的,技巧性的add,removeҎ来完成?br />5、compositeInterface是否应该实现一个compositeInterface列表Q这是一个关于存储的问题Q就是对于子节点的引用对于叶子节Ҏ无意义的内存消耗?br />6、子部g排序QIterator模式应该有一定的作用?br />7、高速缓存改善性能?/p> <p> <br />/*****************************************************************************************/<br />4、decorator(装饰)/包装?wrapper)Q-Q结构型对象模式<br />从名字我们就可以看出q个模式的基本立意:一位画家画完一q画Q实C个组Ӟ之后Qƈ不需要自己去做画框(decoratorQ?做这个画框就是这个模式需要解决的问题?br />可以看到L能ؓd所用是Z一U前提的Q就是画家的用纸和画框的大小是符合的Q也是基于一U结果,是画还是画Q不会因为画框而改变其ȝ本质和内容,只是现在是一q有框的M?br />回到模式中,我们可以看到q个模式的大概了Q?/p> <p>component(lg接口)QconcreteComponent(lg实现)<br />     Qdecorator(装饰?Q->m_cmp(对组件实现的引用)</p> <p>q里我们可以看到decorator模式和adaptor模式的区别,decorator着力于装饰器部分的重用Q而adaptor只是着力于lg的重用。decorator着力于装lg的可以插件化的共性特征,其着眼点是组件别以下的功能重用。adaptor着眼的q是lg一U的功能重用?/p> <p>/*****************************************************************************************/<br />在前面的composite和decorator模式中,我们不停的追求将lg实现得更加的l粒度化Q以便增加组件的可重用性,q基本是各种良好设计的共同特征?br />但是q种设计方式也会D各种问题Q其中就包括零散、以及大量对象实例导致的资源消耗问题?br />/*****************************************************************************************/<br />5、facade(外观)Q-l构型对象模?br />facade模式最大的特点是复杂、零散的子系l进行唯一入口的封装?br />q种模式在我l历的系l印象最q是多层分层的层层之间的接口上,一个唯一的入口,让层ơ非常的清晰?/p> <p>其实q种模式与adaptor有一定的怼之处Q都是屏蔽两个不同的子系l,但是不同的是Qfacade是主动的构徏Q而adaptor是ؓ了接入其他的pȝ而被动的构徏的,可以看出Q要对一个已l实Cfacade模式的子pȝ构徏adaptorq比没有没有实现facade模式的要单的多,代h要小得多?/p> <p>/*****************************************************************************************/<br />6、flyweight(享元)Q-l构型对象模?br />享元设计模式着力解决的是当内存中存在大量同样的对象实例导致的资源消耗问题?br />可以几个斚w来理解,<br />享元模式q求的是实例U别的重用?br />外部状态(上下文)和对象实例本w分,不是在构建时传入外部状态,而是在运行期Q甚臌U状态完全是q程性的Q和对象实例没有关系。而内部状态只在创建时指定Q而在q行期是l对不可以碰的?/p> <p>q种模式与原型模式的最大区别在于,一个共享实例别的Q一个是׃ncȝU别?/p> <p>/*****************************************************************************************/<br />6、proxy(代理)/surrogateQ-l构型对象模?br />常见使用情况<br />1、远E代理(remote proxyQ?br />2、虚代理(virtual proxy)Q根据需要创建开销很大的对象?br />3、保护代理(protection proxyQ:控制对原始对象的讉K?br />4、智能指引(smart refrenceQ:取代单指针,便于在访问对象前做些附加操作?br />q种代理使用q泛Q什么copy_on_write,lazy_loading{技术都可以考虑q种方式的实现?/p> <p>proxy模式代理和被代理对象接口是一致的或者是子集Q但adaptor模式则不同?br />decorator模式为对象增加接口,而proxy是{发或者限制接口?/p> <img src ="http://www.tkk7.com/flyffa/aggbug/65574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flyffa/" target="_blank">flyffa</a> 2006-08-24 17:09 <a href="http://www.tkk7.com/flyffa/archive/2006/08/24/65574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书】设计模式-构徏型模?/title><link>http://www.tkk7.com/flyffa/archive/2006/08/24/65573.html</link><dc:creator>flyffa</dc:creator><author>flyffa</author><pubDate>Thu, 24 Aug 2006 09:08:00 GMT</pubDate><guid>http://www.tkk7.com/flyffa/archive/2006/08/24/65573.html</guid><wfw:comment>http://www.tkk7.com/flyffa/comments/65573.html</wfw:comment><comments>http://www.tkk7.com/flyffa/archive/2006/08/24/65573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flyffa/comments/commentRss/65573.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flyffa/services/trackbacks/65573.html</trackback:ping><description><![CDATA[ <p>2004-05-25</p> <p>每次看设计模式这本书的时候都有着相同的感觉,上次没有真的理解Q这ơ才是理解了Q但是还差那么一点点?br />人其实挺奇怪的Q这些模式在~程的几q之内,无论是具体的目中还是自ql习中,都用了很多Q只是没有作ZU模式ȝ出来而已Q而是以经验的形式存在于脑之中,随意的用,随意的忘却?br />可能是必然的学习过E吧Q随意用-QŞ成模式-Q突破模式灵zd用。而模式在q里L把经验持久化的作用吧Q减忘却的可能?br />所以,真正的掌握模式,除了需要理解模式的表现之外Q需要理解模式着力解决的问题Q理解模式的~陷和优势,才能做到最l灵zL取各个模式之长而灵zȝ合之Q这可能是我在模式领域q求的无招胜有招的境界吧?/p> <p>模式的核心目的大多是两种之一Q重用和解?/p> <p>a归正传,q是来说说具体的模式吧:Design patterns</p> <p> <br />模式分类Q构建型模式<br />模式一Q抽象工?Abstract Factory)<br />Factory理解为对象工厂的概念Q用以生成一个系列的对象l?br />而Abstract Factory是ZFactory之上的概念,目的是把多个pd的对象组抽取共性,屏蔽不同pd之间的对象的差异?/p> <p> pd     motif       windows <br />对象l?br />Button    motifBtn    wBtn<br />Bar       motifBar    wBar<br />Textbox   motifTB     wTB</p> <p>class abstractFactory{<br /> Button getButton();<br /> Bar getBar();<br /> Textbox getTextbox();<br />}</p> <p> <br />button,bar,textbox是一l对象,而我们需要实现motif,windows{不同系列风格的对象l,Abstract Factory提供的方式下Q我们对于大多应用程序而言Q操作的口是abstractFactoryQ以及Button,Bar,Textboxq些对象l,而无需具体兛_是motif风格q是windows风格的,风格pd的指定只军_于实现abstractFactory的具体工厂类?/p> <p>q种Ҏ便于q种pd的增加,但是q不有利于对象组成员的增加,比如要增加一个label对象Q我们就需要增加一个抽象对象LableQ还需要修改abstractFactory以及他所有的子类?/p> <p>所以用这U方法的时候,最重要的是对象l的规划设计?/p> <p> <br />模式二:生成器(builderQ?br />生成器的概念是提供一pd的方法生成对象的不同部分Q最l返回一个完整的对象Q着力于解决构造方法和构造步骤分ȝ问题Qbuilder内部装的是构徏Ҏ而不是过E?br />做了q样的分M后,再将builder做一个抽象,从而得不同的构徏Ҏ和构E做到分R?/p> <p>假设一个串的存储管理:<br />class builder(){<br /> add(key,value);<br /> addStr(str);<br />}</p> <p>同样的操作集合,<br />add(key,value),addStr(str)<br />对于不同的builder,可能输出的结果就会有多种Q?br />key=value;str</p> <p>另一U可能:<br /><root></root><br /> <key></key>value<br /> <s>str</s><br /></p> <p>模式三:工厂Ҏ(Factory)<br />其实他的另一个名字更加能够说明问题(虚构造)<br />也就是说通过抽象cȝ共同Ҏ来避免构造时的硬~码Q?br />如:button对象有个getBtn的方法,<br />可以避免写出button btn = new motifButton();q样的代码,而将q样的代码封装到了子c自w?/p> <p> <br />模式四:原型法(prototypeQ?br />是在应用时q不是创Z个新的对象,而是从已有的对象中拷贝一个?br />q种方式我在做配|池的时候用到过Q每个业务程序从我的池中L贝一个对象,然后才进行相关的修改和应<br />用?br />q种方式同样是动态创建类的方法,着重于解决当对象组的成员不E_的情况,而不是多个系列的问题?/p> <p>与Factory相比Q他q不是每一个原型都需要一个构建子cR?br />~点Qclone本n实现的难度?/p> <p>模式五:单g(singleton)<br />q种模式使用无数Q就不再多说了。用于保证实例的唯一性?/p> <img src ="http://www.tkk7.com/flyffa/aggbug/65573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flyffa/" target="_blank">flyffa</a> 2006-08-24 17:08 <a href="http://www.tkk7.com/flyffa/archive/2006/08/24/65573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书】jvm规范-U程Q锁和优?/title><link>http://www.tkk7.com/flyffa/archive/2006/08/24/65571.html</link><dc:creator>flyffa</dc:creator><author>flyffa</author><pubDate>Thu, 24 Aug 2006 09:07:00 GMT</pubDate><guid>http://www.tkk7.com/flyffa/archive/2006/08/24/65571.html</guid><wfw:comment>http://www.tkk7.com/flyffa/comments/65571.html</wfw:comment><comments>http://www.tkk7.com/flyffa/archive/2006/08/24/65571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flyffa/comments/commentRss/65571.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flyffa/services/trackbacks/65571.html</trackback:ping><description><![CDATA[ <p>2004-10-25</p> <p>W八章线E和?br />q章描述的是非常底层的jvmq作的时候的概念上的部分模型Q与前部分的~译不属于一个层ơ?br />本章提到的变量概忉|指类实例Q类变量Q和cLl。而参数和局部变量ƈ不强行要求到q个变量概念之中?br />8?术语和框?br />jvm中有d存器Q当一个线E被启动Ӟ会创q工作寄存器,当线E运行,会对d存器中的数据q行拯Q存入自q工作寄存器中?br />d存器包含每个变量的主拯?br />d存器也包含锁Q每个对象有个与其相关的锁。线E可以竞争获得一个锁?br />相关术语Q?br />use,assign,load,store,lock,unlock为线E可以执行的动作?br />read,write,lock,unlockZ存储器子pȝ可以执行的动作?br />use,assign是线E执行引擎与工作存储之间的紧密耦合交互作用?br />lock,unlock是线E执行引擎与d储之间的紧密耦合交互作用?br />d储与工作存储之间却是松散耦合的?br />分别对应的动作就是:load,store和lock,unlock</p> <p>注意有三个实体在协同工作Q主存储器,工作存储器,U程q行引擎</p> <p>8?执行序和一致性?br />1。同U程执行动作排序<br />2、主存储执行的、对同一变量的动作排?br />3、主存储执行的、对同一锁的动作排序<br />4、不允许一个动作跟在其自n后面?/p> <p>W?点特D说明:虽然看v来无关紧要,但必L式说明,以保证完整性。因U危险确实存在?/p> <p>U程的动作和d储的动作间的U束Q?br />1、每个lock和unlock动作必须׃些线E和d储共同执行?br />2、每个load动作Q唯一的与一个write动作配对Q这样write动作跟在store动作后?/p> <p>8?有关变量的规?/p> <p>U程T对变量V的操作约束:<br />1、T执行q程中只有需要相应用V时才调用use,或者assign动作?br />2、T执行的assign动作必须插入到T对V的load或者store和后l的由T执行的对V的store之间。(保证d储内值的正确,同时保证assign动作之前工作存储内存在VQ?br />3、在T对V执行use和store之前Q必L行assign或load操作(保证工作存储器中有V,q且已经初始?<br />4、在V创徏后,每个T在use或store之前Q必L行assign或load操作?/p> <p>对于W?点:volatileQ易变)变量有更严格的约?/p> <p>׃存储器执行的read和right操作的约束:<br />1、T对V的loadQ必d有对应的read<br />2、T对V的store,必须后对应的write<br />3、动作A,B是T对V的load或store动作QP,Q为对应的read或write,如果A优先于B,则P必须有些于Q<br /> <br />8.4Double和long变量的非原子处理<br />׃32位机器的效率问题Q有些jvm实现对double和longq种64位值操作是非原子的Q导致一些同步问题(如程序员L需要显式指定同步于对double和long上的操作Q,其实q只是一UY件设计对g的妥协而已?/p> <p>8?有关锁的规则<br />U程为TQ锁为LQT执行的关于L的操作约束如下:<br />1、T对L的lock操作Q必d于每个不是T的线ESQS对L的unlock操作数等于之前的S对L的lock操作?br />2、T对L的unlock操作Q必要求先前T对L的unlock操作敎ͼ于先前T对L的lock操作敎ͼ不解不拥有的锁)</p> <p>8?有关锁和变量交互作用的规?br />U程TQ锁LQ变量VQT执行的关于L和V的操作约束如下:<br />1、在t对V的assign和随后的unlock之间Q必L入store操作。对应于该store的write操作必须先于unlock操作Q保证L对于V的有效性)?br />2、在lock和随后执行的use或store之间Q必L入assign或load操作?/p> <p>8?有关volatile(易变)变量的规?br />U程TQ易变变量V和W<br />1、load和use操作必须成对出现Q紧挨在一Pq且load操作在前<br />2、assign和store操作必须成对出现Q紧挨在一Pq且assign操作在前<br />3、A、B为T对V的use或assign,F、G为对应的load或store,P、Q为对应的read或writeQ如果A先于BQ则P必须优先于Q?/p> <p>8?先见存储操作<br />如果变量没有声明为violateQ则store操作可以提前于assign,store操作将要赋lV的值替代V实际的D行store操作Q只要满I<br />1、如果发生storeQ必然发生assign?br />2、重定位的store和assign间未插入锁定操作?br />3、重定位的store和assign间未插入对V的load<br />4、重定位的store和assign间未插入其他对V的store<br />5、store操作assign操作要放到线ET的Z作ؓ存储器中的gC存储器?/p> <p>8?讨论</p> <p>8?0可能的交?br />一个关于同步和锁的例子?/p> <p>8?1范例Q无序写<br />另一个例?/p> <p>8?2U程<br />U程由Thread和ThreadGroupcd建ƈ理。创建Thread对象创Z个线E,而且是创建线E的唯一方式。当U程被创建时Q它q不是活跃的Q当其startҎ被调用时Q开始运行?/p> <p>8?3锁和同步<br />每个对象都有与其兌的锁?br />当synchronizedҎ被调用时Q它自动执行锁定操作Q如果该Ҏ是实例方法,它锁定同实例相关联的锁,如果Ҏ是static的,它锁定同Class对象相关联的?/p> <p>8?3{待集和通知<br />每个对象除了相关的锁外,q有相关的等待集Q即一l线E,首次创徏的对象,{待集ؓI?br />讲述了wait,notify,notifyall几个ҎQwaitҎ往{待集中增加内容Q而notify或notifyallҎ从等待集中删除内宏V?br />但不能完全读懂内容,可细研究?/p> <p>W九章优?br />本章描述jvm中Sun版本中实现的优化?br />在此优化中,~译的jvm代码在运行期修改Q利用运行期获得的信息,做比源指令更的工作Q以获得更好的性能?/p> <p>9?通过重写动态链?br />寚w写的指oQ指令的每个实例在其W一ơ执行时被替换ؓ_quick伪指令,该指令实例随后执行的L_quick变体?br />其余是对_quick伪指令的描述Q可用于查阅Q因是Sun的jdk在运行的时候的真正指o状态?/p> <p>W十?操作码的操作码助记符<br />q章主要是个附录的功能,可供查阅?/p> <p> <br />×××××××××××××××××××××××××××××××××××<br />在g期了近一个月了之后,l于是看过了一遍这本书Q虽然有很多没有看的非常明白的地方,但是比我预期的效果要好了许多了,q一步的l致研究可以安排在后面?/p> <img src ="http://www.tkk7.com/flyffa/aggbug/65571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flyffa/" target="_blank">flyffa</a> 2006-08-24 17:07 <a href="http://www.tkk7.com/flyffa/archive/2006/08/24/65571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书】jvm规范-~外i=i++http://www.tkk7.com/flyffa/archive/2006/08/24/65569.htmlflyffaflyffaThu, 24 Aug 2006 09:05:00 GMThttp://www.tkk7.com/flyffa/archive/2006/08/24/65569.htmlhttp://www.tkk7.com/flyffa/comments/65569.htmlhttp://www.tkk7.com/flyffa/archive/2006/08/24/65569.html#Feedback0http://www.tkk7.com/flyffa/comments/commentRss/65569.htmlhttp://www.tkk7.com/flyffa/services/trackbacks/65569.html2004-10-24

i=0;i=i++Z么等?q个问题困扰了我好长的一D|_l果前段旉q试图从虚拟机那个层面进行解释,但无论是U程q是Ҏ调用都不能解释其现象Q发现方向性错误,q只是一个语a的特性而已。在java lang spec中提刎ͼ
1、javaq算W的优先U?+W是大于=的?br />2、The result of the postfix increment expression is not a variable, but a value.后+Q符表达式的l果是个D不是一个变量?/p>

也就是说后+Q符先将自己的值存储v来,然后对变量进?+;
再进行赋值操作,也就是将先存储v来的Dl变量i,q样的操作就D了iD|ؓ0?/p>


对于C和C++来说不一P在讲到m=i++操作ӞC语言是先i的Dl了m,然后i?+,q样i=i++的结果自然就?了,c的实C是不存在那个中间的值的存储的?/p>


׃java和c不同的语aҎ,D了i=i++的不同之处,前面的笔C已经提到Q由于java lang spec中的一些细微规定,D其运行结果的不同Q我们可以用个例子来看i=i++在jvm中实际的q行q程?br />源程序test.javaQ?br />public class test {
  public test() {
  }
  public static void main(String[] args) {
    int i=0;
    i=i++;
  }

}
我们用javap来看其实际的虚拟机指令集Q?br />C:\JBuilderX\jdk1.4\bin>javap -c  -classpath "d:/" test
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   nop
   5:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0 //常数0入栈
   1:   istore_1 //i赋|常数值出?br /> //x完成i=0;
   2:   iload_1  //装蝲变量iQ?入栈
 //W?步是Ҏ的一步,q步i值先行保存,以备赋g?br />   3:   iinc    1, 1 //变量值增加,栈内g?br /> //x完成i++
   6:   istore_1 //i赋|0出栈?br /> //x完成i=i++
   7:   nop  //donothing
   8:   return

}

Ҏ而言Q对于i++而言Qi=i++指o多了两步Q??
其实q两步是赋值符号引LQ有意思的是第二步出现的时机,是在iinc之前Q这是因ؓjava lang spec中规定的?/p>

flyffa 2006-08-24 17:05 发表评论
]]>
【读书】jvm规范-class文g格式http://www.tkk7.com/flyffa/archive/2006/08/24/65568.htmlflyffaflyffaThu, 24 Aug 2006 09:03:00 GMThttp://www.tkk7.com/flyffa/archive/2006/08/24/65568.htmlhttp://www.tkk7.com/flyffa/comments/65568.htmlhttp://www.tkk7.com/flyffa/archive/2006/08/24/65568.html#Feedback0http://www.tkk7.com/flyffa/comments/commentRss/65568.htmlhttp://www.tkk7.com/flyffa/services/trackbacks/65568.html2004-10-22

W四章:class文g格式
java.io.DataInput和java.io.Output输入输出的都是以高端字节序输出字节?br />与Cl构的域不同Qclass文g中连l的w序存储,不进行填充或者对齐?br />4.1classFile
一个class文g包含一个单独的classFilel构Q包含:
一个四字节的数表明classcd。具有?XCAFEBABE;
access_flag用于表明是类q是接口Q是abstract,finalq是其他
另外分别有表存储Q常量、属性、方法、域?br />目前属性只有sourceFile属性?br />4?完全限定cdU的内部形式
出现在classFile文gl构中的c都以完全限定类名称的方式出玎ͼq且不是cM于java.lang.xxxQ而是变ؓjava/lang/xxx
4.3描述W?br />域类型有Q根cdQ对象类型,数组cd
根类型有QB,C,D,F,I,J,S,Z
对象cdQL
数组cdQ[
多维数组double[][][] d的表C方式:[[[D
Ҏq回描述W?br />V表示void

object mymethod(int i,double j,Thread t)的方法描q符为:
(IDLjava/lang/Thread;)Ljava/lang/Object;
java的方法不是staticq是实例Ҏ描述W都是如此,区别在于jvmq行时给实例Ҏ隐式的传递当前对象的指针this

4.4常数?br />常数池由一l类gcp_info的结构构?br />cp_info{
 u1 tag;
 u1 info[];
}

4.5?br />每个域由一个变长的field_info构成
field_info{
 u2 access_flags;
 u2 name_index;
 u2 descriptor_index;
 u2 attribute_count;
 attribute_info attributes[attributes_count];
}

4.6Ҏ
每个Ҏ由变长结构method_info构成
method_info{
 u2 access_flags;
 u2 name_index;
 u2 descriptor_index;
 u2 attribute_count;
 attribute_info attributes[attributes_count];
}

4.7属?br />属性用于field_info,method_info,class_filel构之中Q结构一般如下:
attribute_info{
 u2 attribute_name_index;
 u4 attribute_length;
 u1 info[attribute_length];
}

某些属性被预定义作为class文g规范的一部分Q这些属性是QsourceFile,ConstantValue,code,exception,lineNumberTable和localVariableTable属性?/p>

4?对java虚拟Z码的U束

4?class文g的检?/p>

4?0java虚拟机和class文g格式的限?br />



flyffa 2006-08-24 17:03 发表评论
]]>
【读书】jvm规范-jvm虚拟指o集及~译http://www.tkk7.com/flyffa/archive/2006/08/24/65566.htmlflyffaflyffaThu, 24 Aug 2006 09:02:00 GMThttp://www.tkk7.com/flyffa/archive/2006/08/24/65566.htmlhttp://www.tkk7.com/flyffa/comments/65566.htmlhttp://www.tkk7.com/flyffa/archive/2006/08/24/65566.html#Feedback0http://www.tkk7.com/flyffa/comments/commentRss/65566.htmlhttp://www.tkk7.com/flyffa/services/trackbacks/65566.html2004-09-30

W六章:jvm虚拟指o?br />6.1假定Q“必Z的含义
对于jvm指o的一些“必Z的要求Q在q行期要求javaclass的结构是满U束的,对于不满约束的情况Qjvm的行为是未定义的?br />6.2保留操作?br />在java class文g中用的指o操作码,有三个操作码是保留的Q供java虚拟机内部用?br />254Q?xfeQ和255(0xff),分别有助记符impdep1和impdep2,目的是在软g或者硬件实现的特定功能提供“后门”或陷阱?br />202Q?xcaQ?有助记符breakpoint,目的是由调试E序使用来实现断炏V?/p>

6.3虚拟机错?br />当内部错误或者资源限制导致java语言语义不能实现Ӟjvm抛出一个VirtualMachineErrorcȝ子类的实例。jvm规范不规定和语言抛出的时间和地点?/p>

6.4jvm指o?br />我不一一例D各种指o的操作码和用法,需要时Lp了?/p>

W七?为jvm~译
7.1范例格式
java~译成ؓclass文g之后Q以cL~的jvm操作指o方式存在Qjdk自带的javapE序hq样的功能,class文g译L指o集?br />下面是我试的一个实例:
源文件ؓtest.java
public class test {
    public static String a = "";
    public int i =0;
    public test() {
        int i=0;
        String a = "xyz";
    }

}
~译完成为test.class,用javap生成之后输出l果为:
C:\JBuilderX\jdk1.4\bin>javap -c  -classpath "c:/" test
Compiled from "test.java"
public class test extends java.lang.Object{
public static java.lang.String a;

public int i;

static {};
  Code:
   0:   ldc     #4; //String
   2:   putstatic       #5; //Field a:Ljava/lang/String;
   5:   nop
   6:   return

public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   aload_0
   5:   iconst_0
   6:   putfield        #2; //Field i:I
   9:   iconst_0
   10:  istore_1
   11:  ldc     #3; //String xyz
   13:  astore_2
   14:  nop
   15:  return

}

7.2常数、局部变量和控制l构的?br />jvm是面向栈的,大多数操作都是从当前框架的操作数栈中取得操作数?/p>

7?q算
jvm一般在操作数栈上进行运,即从栈中取操作数Qƈ结果存入操作数栈中?/p>

7?讉K常数?br />byte,char,short,以及int值都可以通过立即数的方式~译在method的code中,但是int,long,float,double,以及string实例的引用,需要对常数池进行访问了。用ldc,ldc_w,ldc2_w指o理?/p>

7.5更多控制范例
可供查阅

7?接收参数
如果向java实例Ҏ传递了n个参敎ͼ它们被接Ӟ按约定,框架的编?到n的局部变量ؓ新的Ҏ调用创徏Q顺序ؓ接收的顺序?br />7?调用Ҏ
对java实例Ҏ的调用,是在对象的运行期cd上调度的。用invokevirtual实现Q将其参数取做对常数池表的索引Q给出对象的cȝ型的完整限定W名Uͼ再调用方法的名称和方法的描述W?/p>

对java静态(c)Ҏ的调用,无需传递类实例Q其余和实例Ҏ怼Q用invokespecialҎ实现?/p>

invokespecail指o用于调用实例初始化方法。超cL法和调用privateҎ?/p>

7?处理cd?br />构徏一个类实例的过E,在徏立对象及其实例域之后Q用invokespecial调用相应构造函数对应的Ҏ来初始化对象?br />对对象域的访问用getfield和putfield指o完成?/p>

7?数组
主要讲的是数l操作的相关jvm指oQ如Qnewarray,q一遍,可以查阅?/p>

7?0~译开?br />对于java的switch指oQjvm有对应的两种指oQtableswitch,lookupswitch.
tableswitch指定取D_而lookupswitchq不指定取D_两者如何选择完全由效率选择军_?/p>

7?1Ҏ作数栈的操作
jvm有大量的指o补充Q将操作数栈的内容作为无cd字或成对的无cd字操Uc便于jvm虚拟机指令的灉|l成?br />如dup,dup_x2{,都是对字或者双字进行操作?/p>

7?2抛出或者处理异?br />jvm中try...catch块的处理对于jvm指o处理是透明的,辅助控制是由异常表来完成的,由异常表来决定到哪里去调用处理,哪些部分的异常是受控的?/p>

7?3~译finally
try.....finally语句与try-catch怼Q只是其辅助控制是由指ojsr(子例E调?昑ּ的表C,在jsr调用之前Q将下一指o的地址压入栈中。而异常表只控制try块的范围?/p>

7?4同步
jvm用monitorenter和monitorexit指o对同步提供显式支持。而java常用sychronizedҎ?br />sychronized“方法”通常不是用monitorenter和monitorexit指o实现的。往往是由“方法调用指令”检查常数池里的ACC_SYCHRONIZED标志
但monitorenter和monitorexit指o是ؓ了支持sychronized“语句”而存在的?br />注意q里的方法和语句的区别?/p>

语句实例如下Qtest.java
public class test {
  public test() {
  }
  public static void main(String[] args) {
    synchronized(new Object()){
        int i = 0;
    }
  }

}
~译完的l果Q?br />C:\JBuilderX\bin>javap -c  -classpath "d:/epm40/classes" test
Compiled from "test.java"
public class test extends java.lang.Object{
public test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   nop
   5:   return

public static void main(java.lang.String[]);
  Code:
   0:   new     #2; //class Object
   3:   dup
   4:   invokespecial   #1; //Method java/lang/Object."":()V
   7:   dup
   8:   astore_1
   9:   monitorenter
   10:  iconst_0
   11:  istore_2
   12:  nop
   13:  aload_1
   14:  monitorexit
   15:  goto    23
   18:  astore_3
   19:  aload_1
   20:  monitorexit
   21:  aload_3
   22:  athrow
   23:  nop
   24:  return
  Exception table:
   from   to  target type
    10    15    18   any
    18    21    18   any

}

而synchronizedҎ~译没有Ҏ之处Q只是在Ҏ名上加了synchronzied字样?/p>

flyffa 2006-08-24 17:02 发表评论
]]>
【读书】jvm规范-虚拟机结?/title><link>http://www.tkk7.com/flyffa/archive/2006/08/24/65565.html</link><dc:creator>flyffa</dc:creator><author>flyffa</author><pubDate>Thu, 24 Aug 2006 09:01:00 GMT</pubDate><guid>http://www.tkk7.com/flyffa/archive/2006/08/24/65565.html</guid><wfw:comment>http://www.tkk7.com/flyffa/comments/65565.html</wfw:comment><comments>http://www.tkk7.com/flyffa/archive/2006/08/24/65565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/flyffa/comments/commentRss/65565.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/flyffa/services/trackbacks/65565.html</trackback:ping><description><![CDATA[ <p>2004-09-27</p> <p>W三章:jvml构<br />3.1数据cd<br />基本cd和引用类?br />基本值和引用?/p> <p>数据不需要做标记或者可被检查以定cd。也导致jvm的指令集是针对特定类型的值的?/p> <p>jvm包含对对象的昑ּ支持Q引用类型)</p> <p>3.2基本cd和?br />基本cd--returnAddresscd(jvm指o的操作码的指针,不是javacd)<br /> --数值类?-整型--byte<br />   --short<br />   --int<br />   --long<br />    --点?-float<br />     --double<br />   --char</p> <p>jvm中没有booleancdQjava中的booleancd的操作被译为intcdq行操作?/p> <p> <br />问题Q在数值类型中提及的NaN值对应于java里的什么情?/p> <p>3.3引用cd和?br />有三U引用类型:cȝ型,接口cdQ数l类?/p> <p>3.4?br />jvm中没有指定数据类型的存储器大,只是指定了一个“字”的概念Q一个字以持有byte,int,char,short,float,returnAddress,refrence的|两个字够大持有double,long的倹{?/p> <p>一般来_一个字的大是Lq_的一个指针的大小Q?2位机上,字是32位,64位机上,字是64位的Q但q是实现军_的,而不是jvm规范军_的?/p> <p>3.5q行期数?br />pc(E序计数?寄存器:<br />每个jvmU程有自qpc寄存器,在Q何点Q每个jvmU程执行一个单个方法的 代码Q这个方法被UCؓ那个U程的当前方法。如果方法是native,则pc寄存器的值没有定义,如果不是Q则pc寄存器中存放当前正在执行的jvm指o的地址?br />pc寄存器占一个字宽?/p> <p>栈:<br />每个jvmU程都有U有的栈。等价于传统语言的栈Q它持有局部变量和部分l果。ƈ参与部分Ҏ的调用和q回。(׃java框架是可以堆分配的,所以java的栈的存储空间可以是不连l的Q?br />java栈可以是固定大小或者是动态的。jvm实现可以向程序员提供对java栈的初始大小以及动态情况下的最大和最值的控制?/p> <p>如果固定大小而且U程需要的栈大于栈的大,则出现stackoverflowError<br />如果动态大但存储器没有够空_则出现outOfMemoryError</p> <p>Sun的jdk1.0.2版jvm实现中,java栈是不连l、动态的Q不收羃Q在U程消亡时被回收。java栈的大小的限制可以在jvm启动时用?oss”标志设|?/p> <p>堆:<br />java有一个所有线E共享的堆。堆是用于分配所有类实例和数l的q行期数据区?br />堆在jvm启动时创建,由garbage collector回收?br />堆可以是固定的,也可以动态扩展,q且支持自动收羃Q存储器无需q箋?br />jvm实现可以向程序员提供堆初始大以及动态情况下的最大和最值的控制?/p> <p>如果要求的堆比系l能够拥有的堆大Q则出现OutOfMemoryError</p> <p>Sun的jdk1.0.2中,堆是动态的Q从不收~它的堆Q它的初始值和最大值在启动时用?ms”和?mx”指定?/p> <p>Ҏ区:<br />Ҏ区类g传统语言中编译后代码的存储区Q存储每个类l构例如Q常数池、域、方法数据?br />Ҏ区是虚拟机徏立的时候启动的Q逻辑上是垃圾回收实现的一部分Q但可以不实现?br />Ҏ区可以固定大,可以动态,可以收羃Q无需q箋存储器?br />jvm实现可以向程序员提供Ҏ区初始大以及动态情况下的最大和最值的控制?br />outofmemory异常</p> <p>sun的jdk1.0.2中,仿佛L动态的Q不收羃的,不提供程序员对其最大最值的控制?/p> <p>常数池:<br />常数池是每个cL接口的constant_pool的运行期表示。功能类g传统语言的符可Q但含更宽的数据范围。(详细见第五章Q?/p> <p>自nҎ栈(估计应该是native method stackQ?br />其管理和普通栈cMQ每个线E一个,U程创徏时创建,只是使用非java的native语言Q如CQ写成,以支持nativeҎ?/p> <p>Sun的jdk1.0.2版jvm实现中,java栈是固定大小。java栈的大小的限制可以在jvm启动时用?oss”标志设|?/p> <p>3.6框架<br />jvm frame用于存储数据和部分结果,以及动态链接,q回Ҏ的|和调度异常?/p> <p>每次javaҎ调用时创Z个新的框Ӟ当方法结束的时候,框架撤销。框架从创徏它的U程的栈里分配,每个框架有自q局部变量集和操作数栈(q些可以一ơ分配,因ؓ都是~译期可知的Q?br />对于一个给定线E的M点,只有一个活跃框ӞUCؓ当前框架Q局部变量和操作数栈上的操作L引用当前框架?/p> <p>局部变量:<br />每个jvm frame包含一l局部变量,局部变量L一个字宽,long型,double型存Z个局部变量?/p> <p>操作数栈Q?br />每个jvm frame包含一个操作数栈,l大多数java操作从当前操作数栈取倹{?/p> <p>动态连接:<br />jvm frame通过包含一个对当前cȝ常数池的引用来达到动态链接的目的,java 的class文g仍然可以使用W号引用讉K变量或方法?/p> <p> <br />java中的i=i++从这一章来理解应该是和框架(jvm frame)q个概念有关,也就?+操作W被实现成ؓ了一个方?而不是一个虚拟机指o,q样可以解释了,但是目前q没有看到有++操作W应该被实现Z个方法的说明,另外java的方法调用是g参的,q种情况应该也不会出现值回写的情况.<br />看至3?l束?/p> <p>3.7对象的表C?br />jvm不对对象表示要求MҎ的内部结构?br />在sun公司的jdk实现中,对象实例是指向一个句柄的指针Q而这个句柄本w又包括两个指针Q?、一个指向包含该对象Ҏ而代表该对象cd的class对象的指针,2、另一个指向在java堆中对象实例分配的存储区域?br />别的jvm实现可以采用诸如Q直接插入高速缓存技术,{?/p> <p>3.8Ҏ的初始化Ҏ<br />实例初始化:构造函C为具有特D名字《init》的实例初始化方法出?Ҏ的名字由~译器提供,q个Ҏ由jvm在内部由invokespecial指o调用Q只能用于未初始化的实例上Q不能被javaE序员用?br />cd接口的初始化Q类和接口的初始化具有特D的名字《cinit?Ҏ的名U由~译器提供,该方法由jvm昄调用Q从不直接被java代码和jvm指o调用Q只是作为类初始化进E的一部分被间接的调用?/p> <p>3.9异常<br />异常一层层向上抛,丢弃当前层的操作数栈和局部变量,知道遇到catch为止Q如果到层q没有catchQ当前线E将被结束?/p> <p>3.10class文g格式<br />class文g是^台无x式的二进制文Ӟclass文g格式_定义了文件的内容?/p> <p>3.11指o集概q?br />一个jvm指o׃个字节的操作码后?个或多个操作数构成。操作数的数目由操作码决定?br />当操作数多于一个字节的时候,以高位字节在前的方式存储?br />字节码指令流只是单字节对齐的Q除了tableswitch,和lookupswitch的特D指令对操作数的Ҏ要求Q,攑ּ了数据对齐,反映了对数据紧凑性的偏好Q而排除了可能提高jvm仿真器性能的某些实现技术?br />jvm指o中绝大多数是cd相关的,也就是作用于特定cd的操作数的。ƈ在该指o的助记符中显C的标识出来?br />具体的指令集后面l说?/p> <p>3.12公共设计、私有实?br />公共概念Qclass文g格式和jvm指o?/p> <img src ="http://www.tkk7.com/flyffa/aggbug/65565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/flyffa/" target="_blank">flyffa</a> 2006-08-24 17:01 <a href="http://www.tkk7.com/flyffa/archive/2006/08/24/65565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【读书】jvm规范-基本概念http://www.tkk7.com/flyffa/archive/2006/08/24/65563.htmlflyffaflyffaThu, 24 Aug 2006 08:59:00 GMThttp://www.tkk7.com/flyffa/archive/2006/08/24/65563.htmlhttp://www.tkk7.com/flyffa/comments/65563.htmlhttp://www.tkk7.com/flyffa/archive/2006/08/24/65563.html#Feedback0http://www.tkk7.com/flyffa/comments/commentRss/65563.htmlhttp://www.tkk7.com/flyffa/services/trackbacks/65563.html2004-09-27

学习java虚拟范之前,已经有了心理的准备,像我q种从应用中开始真正了解计机的hQ可能会遇到许许多多的问题,很多关于底层的,gU别的概念可能会无法理解Q但是只要能开始,是q步Q不是吗?/p>

W一章:前言

************************************************************************************************

java虚拟机假定Q何实现技术或Lq_Q它q不非得是解释型的,它也可以像传l的E序设计语言一P通过把它的指令集~译成一个实际的CPU指o集来实现。它也可以直接用微代码或者直接用芯片来实现?/p>

 

W二章:Java概念
Q这个部分是对Java语言的介l,q里|列Z些比较细节的概念Q?br />1、Java语言使用Unicode1.1.5版编写?br />2、除了注释、字W、字W串、标识符之外QJavaE序的所有输入元素都是ascii码Ş式?br />   试证明变量定义可以使用中文?br />3、字W串文字以及更一般的常数表达式的值的字符Ԍ被用ҎString.inter内部化以׃n惟一的实例?br />4、整型和引用cd可以转化为boolean型,非零和非null都ؓtrue。(以标准C++的方式x!=0和obj!=nullQ?br />5、三U引用类型:cd用,接口引用Q数l引用,所有对象包括数l都支持ObjectcȝҎ?br />6、执行顺序:装蝲c-Q-链接一个类型或者类Q检验,准备和可选的解析Q-Q-初始化(q个初始化可能引L关父cȝ初始化动作)
7、类实例退出的时候自动的调用finalize()Ҏ
8、类卸蝲的时候自动调用classFinalize()Ҏ?br />9、虚拟机退出的条gQ?、所有非守护U程中止?、显式调用了Runtime或者System的exitҎ

************************************************************************************************
6、变量是一U存储位|,有相应的cdQ称为编译期cdQ可以是引用cdQ也可以是基本类型?br />   问题Q变量本w是怎样的一个存在,它的l构如何?br />7、java语言中多ơ提到基本数值类型的Ҏ值NaN,但是不知道其表现和用?/p>


2004Q?Q?凌晨1点,读至2?6 执行Q?1c?br />2004-6-3下午五点Q读?4?br />2004Q?Q?晚上8Q?0Q?0Q?0Q读至第三章Qjava虚拟机结构:41?/p>

Z了解i=i++的奥U,我提前阅MW八章:U程和锁Q好像能够理解,l果又被全盘推翻了?通查|上的说法:i=i++的特D之处在于i++Q或者说?+操作W的实现Qi++操作的方式是1Q将i值拷贝一份到另一内存区域Q?、对原i值执?+操作Q?、将i++的结果放入新分配的区域内Q而对于i=i++,多了第四步Q?、将i++值回写到i的存储区域中),但javaZ么这么实C是很清楚



flyffa 2006-08-24 16:59 发表评论
]]>
վ֩ģ壺 ĻѴȫ| 99ƵƷƵ76| һëƬ߲| ɫˬƵ| ˳ɵӰվ| ëƬaëƬѲ100| ޹ղ뾫Ʒ| ȫëƬ߲| Ů18һëƬѹۿ| У԰ɫС˵| yyƵ| ޳a߹ۿ| ѾƷԲ| ɫվ߹ۿ| ޳վ| һ鶹| ƬƵ| AVһַ | Ļav| 99þѹۿ| ޹ŮƷþ| ۺɫƵ| һͼƬ | ޺ݺݰۺӰԺ| һ**ƬƵ| þAV뾫Ʒɫҹ| ձһ| | 鶹Ʒѹۿ| ɫaѿ| ŷ޾Ʒ| ݾþþƷۺר| þĻƷһ| ƷĻѹۿҹ | þ޹Ʒ| ѿԿƵƵsɫ| ޳aƬ߲һ| Ƭһһ߹ۿ| ձ߿Ƭ˳Ƶ1000| ɫվwww| ۺAV߲|