分布式Java应用基础与实践

来源:百度文库 编辑:神马文学网 时间:2024/04/29 19:00:48
2010年11月21日
《分布式Java应用基础与实践》
作者: 林昊 著 (2010年06月第1版第1次)
电子工业出版社 Publishing House of Electronics Industry http://www.phei.com.cn/
北京市海淀区万寿路173信箱(100036) 林昊 China OSGi User Group Director,淘宝网平台架构部架构师。从2006年来开始在实际的商业产品中使用OSGi,根据自己的经验先后编写了《OSGi实战》以及《OSGi进阶》两篇Opendoc,这两篇Opendoc也是到目前为止仅有的完整介绍OSGi的中文资料,为OSGi在中国的推广起到了很大的作用,个人的研究方向主要为Java模块化、动态化系统的构建以及高性能的大型分布式Java系统的构建。 内容简介
本书介绍了编写分布式Java应用涉及的众多知识点,分为了基于Java实现网络通信、RPC;基于SOA实现大型分布式Java应用;编写高性能Java应用;构建高可用、可伸缩的系统四个部分,七章内容来进行介绍,在这一本不算厚的书中,一方面结合作者的经验介绍了这些知识点;另一方面提供了进一步学习这些知识点的参考资料,希望能给想掌握编写分布式Java应用知识点的开发人员提供一定的帮助以及指引,同时也希望书中分享的经验对于目前正在从事分布式Java应用编写的开发人员提供帮助。  P2,Martin Fowler在《企业应用架构模式》一书所说:能不用分布式的情况下不要用分布式。 P4,基于消息方式实现系统间的通信(见图)
服务器端设定监听端口,用于监听客户端的连接事件
客户端则调用服务器及其端口,尝试连接,一旦连接后,客户端直接发送消息。 P14,基于远程调用方式RPC实现系统间的通信(RMI,WebService)
客户端必须需要服务器提供的stub存根对象,由存根对象与服务器进行交互
客户端则直接与存根对象进行调用操作。 P24,SOA强调系统之间以标准的服务方式进行交互,各系统采用不同的语言,不同的框架来实现,交互则完全通过服务的方式进行。 P29,ESB只是个概念并不是SOA实现的标准(SCA是SOA实现的标准),核心思想是基于消息中间件来实现系统间的交互,基于消息中间件所构建的此系统交互的中间场所称为总线,系统间交互的数据格式采用统一的消息格式,由总线完成消息的转化,路由,发送到相应的目标应用。包括:
标准的消息通信格式
消息路由
支持多种的消息交互类型
支持多种网络协议
支持多种数据格式并能够进行相互转换 P66,跟踪收集器采用的是集中式的管理方式,全局记录数据的引用状态。基于一定条件的触发(例如定时、空间不足时),执行时需要从根集合来扫描对象的引用关系,这可能会造成应用程序暂停。主要有复制(Copying)、标记-清除(Mark-Sweep)和标记-压缩(Mark-Compact)3种算法。 P68,SUN JDK中可用的GC(见图) P92,JVM内存状况查看方法和分析工具
1、输出GC日志 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:gc.log -verbose:gc -XX:+PrintTenuringDistribution
2、GC Portal 此GC日志输出的JVM参数为:-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log
3、JConsole   //在线监控资源使用情况
4、JVisualVM  //在线分析资源使用情况
5、JMap  jmap -dump:format=b,file=文件名 [pid]  //生成JVM堆dump文件
6、JHat  jhat -J-Xmx1024m [file]  //分析JVM堆dump文件
7、Eclipse Memory Analyzer        //分析JVM堆dump文件
8、JStat jstat -gcutil [pid] [interval]  //分析GC情况 P105,线程状态及分析
JVM把线程分为几种不同的状态,并根据状态放入不同的sets中来进行调度。线程在创建完毕后进入new状态,调用了线程的start方法后线程进入Runnable状态,放入JVM的可运行线程队列中,等待获取CPU的执行权;JVM按线程优先级及时间分片、轮循的方式来执行Runnable状态的线程。当线程进入start代码段,开始执行时,其线程状态转变为Running;线程在执行过程中如果执行了sleep, wait, join,或者进入了IP阻塞、锁等待时,则进入Wait或Blocked状态,在这种情况下线程放弃了CPU的使用权,进入了wait sets 或者 lock sets 中,直到 wait 结束、线程被唤醒或获取到锁,在这些情况下线程也再次进入Runnable状态;在线程执行完毕后,线程就从可运行线程队列中删除了。
1、jstack [pid]  //输出线程的堆栈信息
2、JConsole -pluginpath [demo/management/JTop.jar]
3、ThreadXMBean java.lang.Threading
4、TDA http://tda.dev.java.net/  //离线分析线程的堆栈信息 P112,集合、并发、网络包(见图)