2008年12月3日星期三

JavaEE_006:会话Bean的生命周期 (摘录+整理)

客户会话(Client Session)的持续期决定了使用中的会话Bean的存活期,这就是术语“会话Bean”的来源。

1. 无状态会话Bean的生命周期

(1)在不同方法调用间不保留任何状态,即每次方法调用结束后,Bean实例都不记得曾经被调用过。
(2)无状态会话Bean不会“专门”地保存客户端的状态。
(3)无状态会话Bean实例池中的Bean实例都是“众生平等”的,每次调用时,都会从池中“随机”选择一个Bean实例来服务客户。
(4)需要传递方法执行过程中需要的所有参数。

2. 有状态会话Bean的生命周期

(1)可以在不同的方法调用间保持针对各个客户端的状态 。
(2)有状态会话Bean会保存客户端的状态。
(3)有状态会话Bean实例池的实现比无状态会话Bean实例池要复杂得多。
因为有状态会话Bean需要保存特定客户端的状态,一个客户端对应一个实例,即使在客户端没有任何请求时,也要为这个客户端保留这个实例。
这样随着客户端数量的增加,EJB容器创建的实例的数量也在增加,超过某个值之后,EJB容器将不再创建新的实例。虽然不创建新的实例,还是要响应用户请求的。
那么,EJB容器是如何做到的呢?它采用的是共享实例的策略。
EJB容器会查看哪个实例虽然处于连接状态(一般根据是最近最少使用原则 Least Recently Used:LRU),但是没有访问,然后把这个实例的状态保存起来,使用这个实例为新的请求服务,对于原来的客户端来说,称为挂起(Passivation)。
如果原来的客户端又发送请求了,会重新查找一个空闲的实例并且把已经保存好的状态恢复回来,这个过程称为激活(Activation)。
(4)不需要传递方法执行过程中需要的所有参数。

3. 生命周期回调
有些时候,当EJB容器创建和管理会话Bean实例时,你可能需要“介入”会话Bean的管理过程。
例如,你可能想在创建会话Bean实例的时候初始化字段变量、获得某些资源,或者在销毁会话Bean实例的时候释放某些资源。
上述这些,你都可能通过生命周期的回调来实现。这些方法将会被EJB容器在生命周期的不同阶段调用。
在EJB 3.0中,会话Bean可以有任意数量,任意名字的回调方法。
(1)@PostConstruct:在Bean类完成实例化后,EJB容器会立即调用此方法。比如给成员变量赋值。适用于有状态和无状态的会话Bean。
(2)@PreDestroy:在结束对@Remove方法调用之后,销毁Bean实例之前,EJB容器会立即调用此方法。比如释放分配给该Bean的所有资源。适用于有状态和无状态的会话Bean。
(3)@PrePassivate:在挂起Bean前,EJB容器会立即调用此方法。比如释放Bean实例持有的资源。只适用于有状态的会话Bean。
(4)@PostActivate:在激活Bean实例后,EJB容器会立即调用此方法。比如重新获得Bean实例在@PrePassivate期间释放的资源。只适用于有状态的会话Bean。
(5)@Init:初始化有状态Bean的方法。与@PostConstruct的区别在于:多个@Init注释方法可以同时存在于有状态Bean中,但每个Bean实例只会有一个@Init的方法会被调用,这取决于Bean是如何创建的。@PostConstruct在@Init之后被调用。
(6)@Remove:销毁有状态会话Bean实例的方法。只适用于有状态的会话Bean。

JavaEE_005:使用JDevloper 11g 开发EJB3.0(摘录+整理)

EJB3.0使用POJO风格的编程模型,这是与传统EJB最大的不同。

1. 创建一个Stateless Session Bean
参见 http://www.oracle.com/technology/products/jdev/11/cuecards/tech_set_34/ccset34_ALL.html

2. 创建一个Stateful Session Bean

3. 创建一个JPA Entities
参见 http://www.oracle.com/technology/products/jdev/11/cuecards/j2ee_set_11/ccset11_ALL.html
如何使用Hibernate作为O-R Mapping的底层实现?

4. 创建一个Message Driven Bean

2008年12月2日星期二

JavaEE_004: JPA是个啥东东?(摘录+整理)

【ORM】:Object-relational mapping 对象关系映射。
把关系数据库中的数据与面向对象的语言中的数据互相进行转换。
【JPA】:Java Persistence API Java持久化API。
作为EJB3.0规范的一部分,JPA 提供了标准的ORM解决方案。
该解决方案定义了服务提供者接口(SPI),开发者不用修改实体代码,就可以使用不同的持久化提供者(如 Hibernate、Toplink、OpenJPA)。
JPA既可以在EJB容器内使用,也可以在Java SE中使用。

JPA包括以下三方面的技术:
(1)ORM映射元数据:JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中; ?
(2)一套操作API:用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。 ?
(3)一套查询语言:使用面向对象而非面向数据库的查询语言查询数据,避免使用SQL语句。

JavaEE_003: EJB3.0 性能调优 (摘录+整理)

Java EE应用中导致性能问题的罪魁祸首就是远程调用,这是分布式应用不可避免的问题。
分布式应用是运行在多个VM(Web容器、Servlet容器、EJB容器、数据库...)中的,这些VM可能分布在不同的机器上,即使在同一台机器上,也需要在不同的VM之间通讯。

1. 使用会话外观(Session Facade)访问实体(JPA实体或实体Bean)
直接访问实体的效率相当低下,需要经过:存根、骨架、Marshaling/Demarshaling、网络调用、EJB对象拦截器。

2. 如果客户端和EJB组件运行在同一个JVM中(如Web客户端),使用本地接口。
本地接口避免了按值传递对象,而是按引用传递对象(省略了序列化和反序列化的过程)。
本地接口虽然避免了远程调用的开销,但与同一个JVM中两个普通Java类之间的通讯相比,客户端还是要通过EJB 容器来调用EJB对象。

至于远程接口,一般只用在如下场合:
(1)需要通过远程访问(比如 远端Web客户端,独立的Java客户端)。
(2)使用独立的Java客户端测试EJB组件。
(3)集群环境,使用远程接口选择更多。比如为了负载均衡、容错。

3. 区分哪些是EJB特定的资源,哪些是独立于EJB的资源。
(1)EJB特定的资源:仅供特定EJB对象的EJB实例使用。
在创建(@PostConstruct)或激活(@PostActivate)EJB实例时获得该资源;
在销毁(@Remove、@PreDestroy)或挂起(@PrePassviate)EJB实例时释放该资源。
(2)独立于EJB的资源:供多个EJB对象的EJB实例使用,创建一次即可,多次重复使用。

4. 无状态会话Bean调优
(1)调整实例池大小:最小值满足系统正常运转,最大值满足系统高峰期运转。设置过大,浪费资源;设置过小,需要频繁创建和销毁大量对象。
(2)有效缓存资源:Just-in-Time策略,需要时才从连接池及时获取连接,用完后立即归还给连接池。

5. 有状态会话Bean调优
(1)调整实例池大小:某些EJB容器事先会创建实例化的、但未同客户绑定的、不含有会话状态的Bean对象。当需要时,EJB容器会从池中取出Bean对象,并初始化它,然后将它绑定到特定客户上。如果EJB容器提供了这类池,可以对池进行调优。
(2)调整缓存大小:当客户并发数超过了有状态会话Bean实例的上限时,EJB容器会强制缓存(挂起)一些有状态会话Bean实例,以便让腾出的有状态会话Bean实例服务其他客户。某些EJB容器支持不同的挂起算法(LRU、FIFO、NRU);还允许指定有状态会话Bean实例空闲多少时间后,挂起它;以及被挂起的有状态会话Bean实例多长时间内未激活,删除它。
(3)有效控制序列化:序列化会消耗CPU和I/O资源。反序列化(激活有状态会话Bean实例时),同样耗费资源。我们可以用Java transient关键字显式告诉EJB容器不要序列化哪些信息。

6. 实体调优
(1)调整实例池大小:调整原则与无状态会话Bean相同。
(2)调整缓存大小:调整原则与有状态会话Bean相同。
其它缓存建议:
(i)为经常使用的实体提供较大缓存,为很少使用的实体提供较小缓存。
(ii)将缓存大小和实例池的最大值设为一样。
(iii)实体的实例池和缓存大小通常都比无状态和有状态会话Bean大得多。例如:一个会话Bean一个finder方法就会返回大量的实体。
(3)使用延迟装载:客户不需要访问实体的所有数据时,可以考虑延迟装载。
(4)选择正确的事务语义。
(5)选择正确的事务隔离级别。
(6)获取大量数据时,建议使用会话Bean + JDBC,不要使用实体。
(7)为Entity Manager 选择合适的RDBMS驱动。
(8)选择正确的Statemant接口。

7. MDB调优
(1)调整实例池大小:调整原则与无状态会话Bean相同。
(2)JMS相关调优。

2008年12月1日星期一

JavaEE_002: EJB3.0是个啥东东?(摘录+整理)

【EJB】:Enterprise Java Bean。
EJB技术是为了分布式企业级应用而生的。
一个EJB是一个可重用的、可移植的Java EE组件。
在MVC架构中,EJB属于Model中的业务层组件。
EJB的任务不外乎这三种:(1)完成某个业务逻辑;(2)访问数据库;(3)集成其它系统。
EJB运行在EJB容器中。
EJB开发者只需关注业务逻辑而不用考虑事务支持,安全性和远程对象访问等复杂的问题。
EJB3.0 规范符合JSR-220。
EJB3.0变化的只是开发和部署模型,其核心框架和架构原理并没有改变。

1. EJB3.0的类型
EJB3.0有三种类型:会话Bean,实体Bean和消息驱动Bean。
(1)会话Bean:用于完成某个任务。
例如检查客户账户历史记录。相当于“动词”。
会话Bean分为有状态会话Bean和无状态会话Bean。
有状态会话Bean在Bean中维护了状态信息,同一Bean实例可以服务同一客户的多个请求;
无状态会话Bean不持有客户状态,因此同一Bean实例不能服务同一客户的多个请求。
(2)实体Bean:代表存在于数据库中业务对象。相当于“名词”。 EJB3.0未对实体Bean做任何改动,即EJB3.0规范用“EJB2.1实体Bean”表示实体Bean。
(3)消息驱动Bean:用于“异步”地完成某个任务。
与会话Bean不同的是,MDB不存在直接客户,而是靠接收异步JMS消息来完成调用的。

【EJB容器】:指实现了EJB规范的软件产品。它提供了EJB组件的生存环境。
EJB容器为提供了如下服务:

  • 事务管理

  • 安全性

  • 资源和生命周期管理

  • 远程可访问能力

  • 支持并发请求

  • 集群和负载均衡

  • 持久化

目前,市场上有超过30个通过Sun认证的Java EE应用服务器。

问题1:JavaBean同EJB的区别?
JavaBean只是提供了get/set方法的Java类。它具有属性、事件及方法。
JavaBean只是开发组件,而不是可部署组件。
JavaBean不需要部署,因此不需要为JavaBean提供运行环境,更不需要容器了。
JavaBean只是Java类,不需要容器去实例化、销毁它们,更不需要提供任何中间件服务。

参考文献
1. 《精通EJB3.0》 罗时飞 译。

JavaEE_001: JavaEE5.0是个啥东东?(摘录+整理)

【Java EE】:Java Platform,Enterprise Edition Java 平台企业版。
Java EE囊括了Java现有的各种技术,用以支持完整的、企业级的服务端开发和部署。
目前的Java EE的版本为5.0。

我们知道,Java 平台有三个版本,这使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发:
1. Java SE(Java Platform,Standard Edition)。
它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。
Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
2. Java EE(Java Platform,Enterprise Edition)。
企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。
Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构SOA 和 Web 2.0 应用程序。
3. Java ME(Java Platform,Micro Edition)。
Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。
Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。
基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

问题1:J2ee 和JavaEE的区别?
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字“2”:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。

问题2:Java EE5.0技术都包括哪些技术?

  • EJB

  • JAX-WS

  • WebServcie Annotation

  • RMI和RMI-IIOP

  • JNDI

  • JDBC

  • JTA和JTS

  • JMS

  • JSP

  • JSF

  • JCA

  • JAXP

  • JAXB

  • JAAS


问题3:这些技术的标准的意义?
标准对于企业级分布式应用有很大意义,它使得:
一个复杂的问题被分解为不同的层次,在不同的层次上用标准的模块(接口)解决不同的小问题。
从而把开发人员从繁复的底层细节中解放出来,只需要编写应用级的代码。
如网络7层协议,网络通信本身依然很复杂,但开发者面对的接口相对就简单多了。

问题4:能否给一个这些技术的架构图?

2008年11月18日星期二

DC_101:经典彩色照片赏析(摘录+整理)

彩色照片除了要具有黑白照片所强调的曝光准确度、密度大小、层次感等要素外,色彩还原、色彩饱和度、所要体现创作思想在色彩上的表现也是极为重要的。

2008年11月17日星期一

DC_100:经典黑白照片赏析(摘录+整理)

黑白照片所强调的是曝光准确度、密度大小、层次感。

2008年11月5日星期三

DC_011:AE锁(摘录+整理)

AE:Auto-Exposure 自动曝光。AE锁就是锁定于某一AE设置,用于自动曝光时人为控制曝光量,保证主体曝光正常。使用AE锁有3点需要注意:
(1)手动方式或自拍时不能使用AE锁。
(2)按下AE锁之后不要再调节光圈大小。
(3)用闪光灯摄影时不要使用AE锁。

DC_010:单反DC与普通DC的区别 (摘录+整理)

【DSLR】:Digital Single Lens Reflex 单镜头反光数码相机。

1. 影像传感器
普通数码相机的影像传感器的尺寸只有单反数码相机的1/3到1/2。因此同样是1000万像素的数码DC和数码单反DSLR,如果都设置在最低感光度来拍摄(例如ISO100或80),假设镜头的素质相同,它们所拍的图片分辨率和图片质量差距不是太大。但如果ISO提高到400来拍摄,图片质量的差别就明显了,DSLR拍出来的图像依然干净,和ISO100时所拍差别不大,而DC的图片质量则下降明显,噪点很大,颜色失真,细节丢失。如果继续提高到ISO800,小数码 DC的图片质量就只能用惨不忍睹四个字来形容了,而数码单反的图片质量虽有下降但依然可以接受。如果进一步提高到ISO1600,大部分数码单反的图片质量也下降得厉害,但依然能满足10寸照片的放大需求,而此时小数码DC的图片质量之差,您需要一颗勇敢的心才敢看。

2. 内部构造

3. 画质差异


4. 镜头差异

5. 其他差异
(1) 快门时滞
(2) 快门速度

2008年11月4日星期二

DC_009:白平衡 White Balance(摘录+整理)


【白平衡】:White Balance。
所谓白平衡,就是数码相机对白色物体的还原。
当我们用肉眼观看这大千世界时,在不同的光线下,对相同的颜色的感觉基本是相同的,比如在早晨旭日初升时,我们看一个白色的物体,感到它是白的;而我们在夜晚昏暗的灯光下,看到的白色物体,感到它仍然是白的。这是由于人类从出生以后的成长过程中,人的大脑已经对不同光线下的物体的彩色还原有了适应性。但是,数码相机的CCD没有人眼的适应性,因此在不同的光线下,会造成数码相机彩色还原失真。

【色温】:在不同温度下呈现出的色彩就是色温,色温的单位是开尔文。当一个黑色物体受热后便开始发光,它会先变成暗红色,随着温度的继续升高会变成黄色,然后变成白色,最后就会变成蓝色。这种现象在日常生活中是非常普遍的,大家可以观察一下灯泡中的灯丝。在摄影领域,光源就是根据它们的色温来定义。

一般情况下,太阳光是白色的,直射日光的色温是5200K左右,白炽灯的色温是3000K左右。色温低时光线中的红,黄色光含量较多,所拍的照片色调会偏红,黄色调,色温高时光线中的蓝、绿色较多,照片会偏蓝、绿色调。用日光片拍摄时,白炽灯光由于色温太低,所以偏黄偏红。现场光线的色温低于相机设定的色温时,往往偏黄偏红,现场光线的色温高于相机设定时,就会偏蓝。为了修正这种偏差,每一次拍照前,数码相机都必须确定哪种颜色是白色。这也就是为什么数码相机拍摄时会比传统相机慢一拍的原因,传统相机拍照时不需要处理白平衡,因为传统相机把白平衡的问题交给胶卷去处理了。传统胶片机相拍摄时,色温问题不容易掌握,通常用不同类型的胶片来解决。例如有日光型、灯光型胶片之分,或者用转换多种色温滤镜的方法来调整,操作起来较麻烦。数码相机的白平衡装置就是根据色温的不同,调节感光材料(CCD)的各个色彩应强度,使色彩平衡。由于白色的物体在不同的光照下人眼也能把它确认为白色,所以,白色就作为确认其他色彩是否平衡的标准,或者是说当白色正确地反映成白色时,其他的色彩也就正确了,平衡了,这就是白平衡的含义。
数码相机预设了几种光源的色温,来适应不同的光源要求。一般家用数码相机有白炽灯(约3000K色温)、荧光灯(4200K色温)、直射日光(约 5200K色温)、闪光灯(约5400K色温)、多云(约6000K色温)、阴影(约8000K色温)几种模式。当我们在拍摄的时候,只要设定在相应的白平衡位置,就可以得到自然色彩的准确还原。而且一般数码相机还有自动白平衡设置,可以适应大部分光源色温。但是遇到现场光源复杂时,相机自动白平衡判断也容易失误,我们可以通过CCD观看结果,用手动来调节。当你用手动白平衡设定时,最准确的方法就是用一张白纸,让相机取景完全充满白纸,设定在手动白平衡功能上,按相机说明书操作做一遍就可以设定完成,在现场特定的光源下就可以把白色还原正确了。


白平衡模式介绍
1. 自动白平衡
自动白平衡通常为数码相机的默认设置,相机中有一结构复杂的矩形图,它可决定画面中的白平衡基准点,以此来达到白平衡调校。这种自动白平衡的准确率是非常高的,但是在光线下拍摄时,效果较差,而在多云天气下,许多自动白平衡系统的效果极差,它可能会导致偏蓝。

2. 钨光白平衡
钨光白平衡也称为“白炽光”或者“室内光”。设置一般用于由灯泡照明的环境中(如家中)当相机的白平衡系统知道将不用闪光灯在这种环境中拍摄时,它就会开始决定白平衡的位置,不使用闪光灯在室内拍照时,一定要使用这个设置。

3. 荧光白平衡
适合在荧光灯下作白平衡调节,因为荧光的类型有很多种,如冷白和暖白,因而有些相机不只一种荧光白平衡调节。各个地方使用的荧光灯不同,因而“荧光”设置也不一样,摄影师必须确定照明是哪种“荧光”,使相机进行效果最佳的白平衡设置。在所有的设置当中,“荧光”设置是最难决定的,例如有一些办公室和学校里使用多种荧光类型的组合,这里的“荧光”设置就非常难以处理了,最好的办法就是“试拍”了。

4. 室内白平衡
室内白平衡或称为多云、阴天白平衡,适合把昏暗处的光线调置原色状态。并不是所有的数码相机都有这种白平衡设置,一般来说,白平衡系统在室外情况时处于最优状态,无需这些设置。但有些制造商在相机上添加了这些特别的白平衡设置,这些白平衡的使用依相机的不同而不同。

5. 手动调节
这种白平衡在不同地方有各不相同的名称,它们描述的是某些普通灯光情况下的白平衡设置。一般来说,用户需要给相机指出白平衡的基准点,即在画面中哪一个 “白色”物体作为白点。但问题是什么是“白色”,譬如不同的白纸会有不同的白色,有些白纸可能稍微偏黄些,有些白纸可能稍稍偏白,而且光线会影响我们对“ 白色”色感,那么怎样确定“真正的白色”?解决这种问题的一种方法是随身携带一张标准的白色的纸,拍摄时拿出来比较一下被摄体就行了。这个方法的效果非常好,那么在室内拍摄中很难决定此种设置时,不妨根据“参照”白纸设置白平衡。在没有白纸的时候,让相机对准眼球认为是白色的物体进行调节。

DC_008:信噪比 Signal-to-Noise(摘录+整理)

数码摄影和传统相机不同,传统相机拍摄时很少因电子零件产生的杂讯干扰影响拍摄品质。但是数码摄影的杂讯产生环境就复杂多了,从操作过程中机体升温效应,CCD上的残留能量以致于机身零件本身,甚至来自外界的电磁波干扰都有可能。
我们常常针对在黑暗的环境中长时间曝光方式拍摄到的图像来讨论这个问题。比如,你将传统相机的镜头完全盖住,打开快门拍摄,因为底片根本没有感光,所以冲洗出来的照片应该不会出现黑色以外的的颜色。可是数码相机就不同了,同样的拍摄方式则可能出现以下的结果:


(1)传统相机完全盖住镜头拍摄后效果。
(2)数码相机完全盖住镜头拍摄后效果。
超过8秒以上的曝光时间,再放到PC上观察CCD上所记录到的异色亮点。
因此,使用数码相机如果需要长时间曝光,影像质量可能就会打一些折扣。

2008年11月3日星期一

DC_007:感光度ISO (摘录+整理)

ISO:International Standards Organization 国际标准化组织。
国际标准组织制定了很多工业标准,包括胶卷的生产标准,它们反映的是胶片或CCD感光能力的大小。
目前胶卷有ISO100,ISO200和ISO400这几种标准,数字越大,感光度越高。 举个例子,如果用ISO100的胶卷,相机2秒可以正确曝光的话,同样光线条件下用ISO200的胶卷只需要1秒即可,用ISO400则只要0.5秒。ISO100是我们常用的胶片标准,适用于一般拍摄。

问题1:如何选择不同的感光度的胶片?
高ISO胶片感光速度快,但图像颗粒粗糙,适合拍抓拍运动场面或者动态景物,画面有噪点,合理运用可以产生比较特殊的画面效果。
低ISO胶片感光速度慢,但图像颗粒精细,适合拍人像或风光静物,画面更加细腻,层次感更加丰富。
高ISO胶片感光时间短,需要缩写光圈或者提高快门来减低曝光。
低ISO胶片的感光时间长,需要放大光圈或者放慢快门来补充曝光。

问题2:暗环境下如何拍摄?
在暗环境下,如昏暗的室内,午夜的街头,使用ISO100的胶片即使光圈开到最大,快门速度也需1/4秒甚至更慢才能正确曝光,这时不用三脚架是无法把相机端稳的,手一晃照片就模糊;就算使用三脚架,被摄者一转头照片同样会糊。闪光灯可以救急,但闪灯会破坏现场气氛,人脸会不自然,而且闪光灯的有效距离不会超过四米,稍远的人物和景物就无法照亮了。更何况有些地方是不准使用闪光灯的,如博物馆和剧院。在此情况下,我们只有提高数码相机感光度到ISO800甚至ISO1600。

DC_006:镜头(摘录+整理)

问题1:如何辨别镜头的好坏?
高档镜头都需要严格的出厂检验,一般来说不需要购买者检验。
如果是二手镜头,则必须经过检验。检验方法如下:
(1)将快门调至"B",然后打开快门,并把光圈调到最大,仔细检查镜面有无划痕,有无霉变,有无气泡。
(2)取一张报纸,保证光线均匀地照射到报纸,然后相机正对报纸,微距拍摄3张不同光圈下的照片(最大光圈,中档光圈,最小光圈)。仔细观察这三张照片的文字是否清晰无变形,四个边角是否清晰无变形,光线是否均匀洒满整个画面。

问题2:如何保养镜头?
(1)防潮,防晒,防高温,防油气,防污垢,防骤冷骤热。
(2)镜头前加装UV镜,防止意外破损镜头,UV镜对彩色、黑白摄影均无影响。
(3)不用时,把焦距调到“无穷远”,保存在阴凉干燥的地方。

问题3:如何擦拭镜头?
(1)严禁使用汽油,酒精擦拭镜头,严禁用手指触碰镜头。
(2)镜头如果有灰,先用软毛或气吹拂去灰尘,再用镜头纸或麂皮(也是一次性的)轻轻擦拭。
(3)如果遇到镜头凝结水蒸汽,切忌强行擦拭,应该等待水蒸气自行消失。

问题4:镜头的孔径与光圈的关系?
我们常常看到体育比赛时,场边的记者都拿着各种各样的长枪短炮,它们无一例外地是大孔径镜头,比赛现场不允许使用闪光灯,而大孔径的镜头透光能力强,比较适合较暗的环境。大孔径的镜头表明它可以达到的最大通光量的程度,即它所能达到的最大光圈。。
需要记住的是:不同孔径的镜头在同一个光圈上的通光量是一样的。所不同的是,大孔径的镜头的最大光圈可以很高。

问题5:镜头的种类有哪些?镜头的种类: 镜头的种类很多,不存在一种“最好的”镜头。因为各种镜头都有独特的功能、适用范围和优点,针对拍摄需要去选择镜头,才是正确的。依据拍摄画面的不同效果及照相机镜头焦距的长短,通常镜头的种类有:标准镜头、广角镜头、远摄镜头、鱼眼镜头、反射式镜头、变焦镜头和特殊镜头等。
  1. 标准镜头
    标准镜头属于校正精良的正光镜头,其焦距长度等于或近于所用底片画幅的对角线,视角与人眼的视角相近似。如135相机的画幅为56×56mm,那么其标准镜头焦距则为50mm。因而,标准镜头的成像效果,诸如摄取景物的范围、前后景物的大小比例带来的透视感等,都与人眼观看的效果类同,画面影像较为真切自然,其成像质量相对来说比较高,故而在各种摄影中应用广泛,适应力强。凡是要求被摄景物必须符合正常的比例关系,均需依靠标准镜头来拍摄。它是使用最为广泛的一种镜头。
  2. 广角与超广角镜头
    广角镜头的特点是:焦距短、视角广、景深长,而且均大于标准镜头。其视角超过人们眼睛的正常范围。凡视角在70度至90度左右的镜头,即为广角镜头;其视角为100度左右的,即称为超广角镜头。这类镜头其最大的优点为在较近距离内拍摄较大的场景。它具体的特性与用途表现在:视角广,有利于在狭窄的环境中,拍摄较广阔的场面;景深长,可使纵深景物的近大远小比例强烈,使画面透视感强。其缺点是,影像畸变差较大,尤其在画面的边缘部分,因此在近距离拍摄中应注意变形失真。
  3. 远摄与超远摄镜头
    这类镜头也称长焦距镜头,它具有类似望远镜的作用。这类镜头的焦距长于、视角小于标准镜头。如135相机,焦距在200mm左右,视角在12度左右称为远摄镜头,焦距在300mm以上,视角在8度以下称为超远摄镜头。这类镜头具有的特点表现在:景深小,有利于摄取虚实结合的形象;视角小,能远距离摄取景物的较大影象,对拍摄不易接近的物体,如动物、风光、人的自然神态,均能在远处不被干扰的情况下拍摄;透视关系被大大压缩,使近大远小的比例缩小,使画面上的前后景物十分紧凑,画面的纵深感从而也缩短;影象畸变差小,这在人像中尤为见长。
  4. 鱼眼镜头与反射式镜头 鱼眼镜头是一种极端的超广角镜头。对135相机来说是指焦距在16mm以下,视角在180度左右,因其巨大的视角如鱼眼而得名。它拍摄范围大, 可使景物的透视感得到极大的夸张。它使画面严重的桶形畸变,故别有一番情趣。反射式镜头是一种超远摄镜头,外观短而胖,比相同焦距的远摄镜头短一半,重量轻,使用灵活方便。它的缺点是只有一档光圈,故对景深控制不利。
  5. 变焦镜头
    变焦是镜头可以改变焦点距离的镜头。所谓焦点距离,即从镜头中心到胶片上所形成的清晰影像上的距离。焦距决定着被摄体在胶片上所形成的影像的大小。焦点距离愈大,所形成的影象愈大。变焦镜头是一种很有魅力的镜头。它的镜头焦距可在较大的幅度内自由调节,这就意味着拍摄者在不改变拍摄距离的情况下,能够在较大幅度内调节底片的成像比例,也就是说,一只变焦镜头实际上起到了若干只不同焦距的定焦镜头的作用。

2008年11月2日星期日

DC_005:CCD (摘录+整理)

【CCD】:Charged Coupled Device 电荷耦合器件。
数码相机的最核心的部件,类似于传统相机的底片的感光系统,它使用一种高感光度的半导体材料制成,能把光线转变为电荷,通过模数转换器芯片转换成数字信号,数字信号经过压缩以后保存在内置硬盘卡上。
单CCD摄像机是指摄像机里只有一片CCD并用其进行亮度信号以及彩色信号的光电转换,其中色度信号是用CCD上的一些特定的彩色遮罩装置并结合后面的电路完成的。由于一片CCD同时完成亮度信号和色度信号的转换,因此难免两全,使得拍摄出来的图像在彩色还原上达不到专业水平很的要求。为了解决这个问题,便出现了3CCD摄像机。3CCD,顾名思义,就是一台摄像机使用了3片CCD。我们知道,光线如果通过一种特殊的棱镜后,会被分为红,绿,蓝三种颜色,而这三种颜色就是我们电视使用的三基色,通过这三基色,就可以产生包括亮度信号在内的所有电视信号。如果分别用一片CCD接受每一种颜色并转换为电信号,然后经过电路处理后产生图像信号,这样,就构成了一个3CCD系统。和单CCD相比,由于3CCD分别用3个CCD转换红,绿,蓝信号,拍摄出来的图像从彩色还原上要比单CCD来的自然,亮度以及清晰度也比单CCD好。但由于使用了3片CCD,3CCD摄像机的价格要比单CCD贵很多,所以只有专业用的摄像机才会使用3CCD。

【CMOS】: //TODO
【像素】:CCD上面的感光元件的数量,一个感光元件叫一个像素。一张图片可以理解为由很多个小的点组成,每个点就是一个像素。显然,像素数越多,画面就会越清晰。但像素数的增加会使制造成本以及成品率下降,像素数增加到一定数量后,画面的清晰度的将不再显著提高。

【CCD尺寸】:传统的照相机胶卷尺寸为35mm,35mm为胶卷的宽度(包括齿孔部分),35mm胶卷的感光面积为36 x 24mm。换算到数码相机,对角长度约接近35mm的,CCD/CMOS尺寸越大,成像质量也越好。现在市面上的消费级数码相机主要有2/3英寸、1/1.8英寸、1/2.7英寸、1/3.2英寸四种。相同尺寸的CCD ,像素高的,有利于成像质量的提高,但这也会导致单个像素的感光面积缩小,有曝光不足的可能,造成图像质量的下降。如果希望在增加像素的同时保持现有的图像质量,就必须在保持单个像素面积不变的基础上增大CCD的尺寸。所以现在的数码相机不应该在1000万像素以上再简单增加几百万像素,而应该在提高CCD质量上下功夫。降低高感光度(高ISO)噪音水平以及增大曝光宽容度才是当务之急。我们在选择数码相机时就不该只看像素高低,也应该注意相机CCD的大小。

DC_004:光圈 Aperture (摘录+整理)

光圈:控制镜头的通光量的多少。
问题1:光圈大小是如何规定的?它们之间的关系如何?
(1)各级光圈的标注如下:f/1,f/1.4,f/2,f/ 2.8,f/ 4,f/ 5.6,f/8,f/ 11,f/16,f/22,f/32,f/ 44,f/64。
(2)数字越小,光圈越大。
(3)开大一挡光圈,光量加倍;缩小一挡光圈,光量减半。如f /4孔径所接纳的光线是f/5.6的两倍,f/5.6接纳的光线是f/8的两倍,依此类推。

问题2:大光圈的特点是什么?
光圈越大,通过的光就越多。
大光圈的特点是能够获得很浅的景深,就是那种主体清晰,前后景模糊的效果,这个手段经常被用在人像摄影当中,能够突出主体。当然,在大光圈下的聚焦一定要保持准确,否则比较浅的景深很容易造成焦点的偏差。

问题3:小光圈的特点是什么?
光圈越小,通过的光就越少。
小光圈的特点是能够获得很长的景深,比较适合表现宽广的风光环境,清晰度范围很大。

问题4:光圈大小是如何影响成像效果的?
以下照片所有其它条件保持不变(照明条件,快门速度),唯一变化的就是光圈。
问题5:请具体说明如何应用各挡光圈?

  1. f/2
    孔径较大,适合在暗弱照明条件下获得足够的曝光量,如现场光照明。
    景深范围较浅,有助于使背景离开焦点,从而把注意力集中到被摄主体上。
    成像质量较差。
  2. f/2.8
    孔径比f/2小一倍,适合多云的天气或者被摄主体在阴影处时使用。
    景深范围略浅,提供有限的清晰聚焦的范围。
    成像质量较好。
  3. f/4和f/5.6
    孔径比f/2.8小一倍和两倍,适用于户外日光下拍摄。
    景深范围适度。
    具有极好的结像质量。
  4. f/8
    孔径比f/5.6小一倍,适用于户外日光下拍摄。
    景深范围很大。
    具有极好的结像质量。
  5. f/11
    孔径比f/8小一倍,适用于户外日光下拍摄。
    景深范围更大。
    具有极好的结像质量。
问题6:光圈与快门的曝光组合——“ 倒易率”
当一个景物的正确曝光确定以后,你可以变换不同的曝光组合来达到不同的效果,比如:一个场景在ISO100下面的正确曝光值是 F8,1/125,那么,你可以选择F5.6,1/250或F11,1/60等等很多种组合,来控制画面的表现方式。
这里面就是一个摄影常用的规律“ 倒易率”:为了保证曝光量的正确,可以放大一挡光圈,同时提高一挡快门;或者缩小一挡光圈,同时放慢一挡快门。
当然,这种倒易率也有失效的时候,比如拍摄月夜、星空等特别的环境,这里就不是简单的倒易率能解决了,更多依靠摄影者的经验和技巧,这是需要实践来总结的。

问题7:何时使用光圈优先,何时使用快门优先?数码相机上都有S(快门优先)、A(光圈优先)拍摄模式,那么何时应该使用哪种模式呢?
1. 光圈优先
光圈优先就是手动定义光圈的大小,然后利用相机的测光获取相应的快门值。
由于光圈的大小直接影响着景深,因此在平常的拍摄中此模式使用最为广泛。在拍摄人像时,我们一般采用大光圈长焦距而达到虚化背景获取较浅景深的作用,这样可以突出主体。同时较大的光圈,也能得到较快的快门值,从而提高手持拍摄的稳定。在拍摄风景这一类的照片时,我们往往采用较小的光圈值,这样景深的范围比较广,可以使远处和近处的景物都清晰,同样这一点在拍摄夜景时也适用。

2. 快门优先
与光圈优先相反,快门优先是在手动定义快门的情况下通过相机测光而获取光圈值。
快门优先多用于拍摄运动的物体上,特别是在体育运动拍摄中最常用。很多朋友在拍摄运动物体时发现,往往拍摄出来的主体是模糊的,这多半就是因为快门的速度不够快。在这种情况下你可以使用快门优先模式,大概确定一个快门值,然后进行拍摄。并且物体的运行一般都是有规律的,那么快门的数值也可以大概估计,例如拍摄行人,快门速度只需要1/125秒就差不多了,而拍摄下落的水滴则需要1/1000秒。

DC_003:快门 Shutter (摘录+整理)

快门:控制曝光时间的长短。
配合光圈的变化,可以调整快门的速度来实现正确曝光。

问题1:快门速度是如何规定的?它们之间的关系如何?
(1)各级快门的标注如下:......1,1/2,1/4,1/8,1/15,1/30,1/60,1/125,1/250,1/500,1/1000,1/2000,......
(2)上面每一组数字的单位都是秒,譬如1是一秒、1/15代表的就是15分之一秒、1/125代表的就是125分之一秒。跟光圈一样,上面每一个相邻的快门值之间都有一级的差异。例如1/8跟1/15两个快门相差了一级、1 /125与1/250也有一级的差距。

问题2:快速快门的特点是什么?
快速快门可以把运动的瞬间凝固,比如喷涌的瀑布,在阳光下凝结成晶莹剔透的水珠。

问题3:慢速快门的特点是什么?
慢速快门的效果是不动的主体是清晰的,背景中流动的人群,车流变成模糊的运动效果,画面的生动性加强。

问题4:请具体说明如何应用各挡快门?
  1. B门
    必须使用三脚架。
    快门开启时间的长短由按下快门按钮的时间来控制。
    适合户外夜间使用小光圈、大景深的拍摄。如拍摄焰火、闪电及记录夜间由移动照明形成的条纹图案(如行驶着的汽车灯)。
  2. 1和1/2秒
    必须使用三脚架。
    适合在暗淡照明情况下使用小光圈获得大景深和足够的曝光量(如现场光或摄影灯照明)。适合拍摄无生命的物体和稳定不动的被摄体。
  3. 1/4秒
    必须使用三脚架。
    适合在暗淡照明情况下使用小光圈获得大景深和足够的曝光量(如现场光或摄影灯照明)。适合稳定的被摄体,特别适于拍摄成年人肖像。
  4. 1/8秒
    必须使用三脚架。
    适合在暗淡照明情况下使用小光圈获得大景深和足够的曝光量(如现场光或摄影灯照明)。适合稳定的被摄体,对于在限定范围内拍摄成年人比用1/4秒快门速度时更好。
  5. 1/15秒
    建议使用三脚架,若能握持得相当平稳,可以手持相机进行拍摄。
    适合在暗弱照明条件下,使用小光圈以获得大景深和足够的曝光量。
  6. 1/30秒
    手持相机拍摄时,推荐的最慢快门速度,前提条件是相机必须握持的极平稳。
    适合大多数现场光摄影。
    适合在多云天气或阴影处用小光圈以获得大景深。
  7. 1/60秒
    适于照明条件不太理想,如多云的天气、在阴影处等户外日光下用小光圈以获得大景深。
    在较明亮的现场光照明的场所也可以使用。
    适用于单反相机的闪光灯同步。
  8. 1/125秒
    这是户外日光下拍摄照片最好的快门速度。
    在明亮的照明情况下,使用中等大小的光圈到小光圈能产生很好的景深。
    能抓住一些中等速度的动作,如走动着的人,儿童的游戏或是自由活动着婴孩。
    适合于手持相机安装上105mm焦距镜头进行拍摄。
    这档快门速度被推荐用于某些单镜头反光照相机使用闪光灯拍摄。
  9. 1/250秒
    适合抓住一般速度的运动体,例如以中等速度跑动着的人、游泳运动员、自行车运动员、在一定距离外奔跑着的马、检阅活动、奔跑着的小孩、帆船、棒球运动、以中等速度比赛的足球运动员。
    当你并不需要大景深,而主要是想抓住动作的时候,可以在户外日光照明情况下用这档快门速度,以使相机的震动程度减至最小。
    适合于手持相机安装上250mm焦距镜头进行拍摄。
  10. 1/500秒
    适合抓住运动速度较快的动体,例如中等距离外的运动员、奔跑着的马、跳水运动员、快速骑驶着的自行车运动员、行驶着的轿车或跑动中的篮球运动员。
    这档快门速度能用来抓住除了最快速度外的所有动体。
  11. 1/1000秒
    是抓住快速动体的最佳速度。如赛车、摩托车、飞机、快艇、野外和体育场内的比赛项目、网球运动员、滑雪运动员及高尔夫球运动员。
    因为使用该快门速度时需用比其它快门速度时更大的光圈,因此它的景深最小。
    适合于手持相机安装上400mm焦距镜头进行拍摄。

DC_002:焦距 Focus (摘录+整理)



问题1:请说一说成像原理。
这里需要我们复习一下初中物理有关光学的知识。
焦距:焦点到光心的距离。
像距:最清晰的像到光心的距离,焦距一般不等于像距(像距总是略大于焦距)。注意,在DC中所说的焦距多少其实指的是像距。
焦平面:是胶片(或CCD/CMOS感光元件)所在的平面,焦平面在像距上,即焦平面到光心的距离等于像距。
物距:u,像距:v,焦距:f。
光学中最基本的高斯成像公式:1/u + 1/v = 1/f,即物距的倒数加上像距的倒数等于焦距的倒数。
有物才有像,不同的物距会对应不同的像距,但是反过来却不行。设定一个像距不一定会找到对应的物距,因为设定的像距根本就无法成像。
对于凸透镜成像而言(照相机就是凸透镜成像),物像关系是这样的:
  1. 当物距为无穷远时,像距等于焦距,成像在焦平面上(照相机聚焦无穷远的情况)。
  2. 当物距为无穷无与两倍焦距之间时,像距在焦距与两倍焦距之间,成缩小的实像(照相机一般都属此类情况,在物距接近两倍焦距时为微距拍摄情况)。
  3. 当物距等于两倍焦距时,像距与物距相等,此时物像等大,1:1微距即此种情况。
  4. 当物距小于两倍焦距并大于焦距时,像距大于两倍焦距,成放大的实像(幻灯机,电影放映机就是这种情况,对照相机而言,少数的微距拍摄,如美能达的1X-3X微距,佳能的5X微距拍摄也是这种情况)。
  5. 当物距等于焦距时,像距为无穷大,物上的光线经透镜后为平行光线,不成像。
  6. 当物距小于焦距时,像距为负值,即在物的同侧成虚像(放大镜就是这种情况)。
显而易见,像距是由于物距和焦距决定的,而且像距小于焦距成实像的情况是不会发生的。
问题2:长焦与短焦的特点是什么?
相同距离下,焦距越长,则被摄体在胶片上形成的影像就越大,摄取的范围越小(视角越小);反之,焦距越短,则被摄体在胶片上形成的影像就越大,摄取的范围越大(视角越大)。
例如,使用100mm镜头所拍摄的影像,其高度和宽度都是在同一架照相机上使用50 mm镜头所拍摄影像的2倍;400 mm镜头产生影像的高度和宽度是100 mm镜头的4倍,等等。

问题3:如何聚焦?AF:Auto-Focus 自动对焦。
进行聚焦时,最好先使用镜头的最长焦距端聚焦,将影像调至最大处。然后再把焦距变小到拍摄所需的焦距上。在此过程中,所有焦距上的影像始终保持清晰。

问题4:DC焦距与传统135相机的焦距换算关系?
现在数码相机上的标注的焦距值都是按照传统135相机换算的。由于现在的数码相机感光元件的表面积(CCD、COMS)绝大多数都没有一张135的底片大,而且大小都不一样,这样就产生麻烦。因为焦距不好定义了。有的把20mm焦距当广角,而有的却当成标准镜头的焦距,还有的甚至当成望远镜头的焦距。所以数码相机生产出来以后镜头的焦距值一般都换算成与传统135相机的相当的焦距值。
换算关系如下:传统胶片大小为36*24mm,其对角线大约为43mm。如果数码相机的CCD的尺寸是22.2×14.8mm ,其对角线长度大约为27mm。转换系数就是画幅对角线的比值,即43/27=1.6。尼康和宾得的转换系数大约为1.5左右。奥林巴斯和柯达的转换系数大约为2。如果是全画幅的单反相机其转换系数就为1,就不需要转换了。

问题5:请具体说明不同焦距的用途?

  1. 8mm:极度夸张的画面,用途不限。
  2. 18-16mm:极度夸张的画面,用途不限。
  3. 22mm-24mm:不严谨的建筑全景,或某个自然景观(严谨的需要大画幅和移轴镜头来矫正相差),城市建筑群,大量的人群。
  4. 28mm:广阔的风景,人多的场景,有群体感的人像。
  5. 35mm:一般风景,建筑或者建筑内部,纪实人像。
  6. 50mm:局部风景,全身人像,事实上可以用于任何场景和题材。
  7. 60-65mm:小微距,适合拍一些比如杯子大小物体或者电饭煲之类的商品,这个焦段适合购买微距镜头。
  8. 80mm:半身人像,一些特写,或者在场景中突出某人。
  9. 100mm:微距的黄金焦距,特别适合拍摄微距题材。
  10. 135mm:人像焦距,适合人像特写,网上那些特别漂亮的mm,背景虚化的,都是这个焦距拍出来的(一般用85mm镜头放到普通APS单反上,由于转换系数,正好可以获得135的焦距)
  11. 200mm:人像特写,大头像,远景拍摄。
  12. 300mm: 远处人想特写,距离较近的鸟,体育,远景拍摄。
  13. 400MM--600mm: 野生动物,足球比赛等。
  14. 1200mm: 天文摄影,危险的野生动物,大型体育场馆里的比赛。

2008年11月1日星期六

DC_001:色彩是如何产生的? (摘录+整理)

谈到摄影,我们必须从身边的这个五彩缤纷的大千世界谈起,我们不禁要问:色彩是从哪里来的?
【色彩】:色彩是光源中的可见光在不同质的物体上的反映。
光源可分为:(1)天然光源 (2)人工光源 (3)其他光源(生物光,自然发光物等)
初中物理告诉我们:我们所能看到的太阳光实际上是可见光,由赤、橙、黄、绿、青、蓝、紫七种色光组成的。 七种色光混合在一起呈现白色光。当阳光照射在物体上,由于物体特质的不同,吸收一部分色光,反射一部分色光,全反射的就呈现白色,全吸收的就呈现黑色,只反射红光的物体呈红色,反射青黄两色的就是青黄混合色,即绿色。最终经过光线—>物体—>眼睛—>大脑,我们看到了不同的色彩。由此可见,决定物体不同颜色是光线照射到该物体上时被吸收和被反射的程度。

三原色:红、黄、蓝。红色+绿色=黄色
绿色+蓝色=青色
红色+蓝色=品红
红色+绿色+蓝色=白色

三补色:青、品、黄。
【补色】:如果两种颜色混合后形成中性的灰黑色,这两种色彩为互补色。如黄与紫、青与橙、红和绿均为互补色。
一种原色的补色即为除此原色外另外两种原色的和色。三原色中,红与绿的和色为黄,绿与蓝的和色为青,红与蓝的和色为品。
一种特定的色彩总是只有一种补色,做个简单的实验即可得知。当我们用双眼长时间地盯着一块红布看,然后迅速将眼光移到一面白墙上,视觉残象就会感觉白墙充满绿味。这种视觉残象的原理表明,人的眼睛为了获得自己的平衡,总要产生出一种补色作为调剂。
这种现象还说明了这样一种道理,有些作品画面色彩单调,而且生,这是由于画面中的色彩布局不能满足视觉补色的平衡要求而造成的。在约翰内斯·伊顿先生设计的色彩环形轮上,对比色(互补色)是每条直径两端上的色彩。互补色还具备两种特征:
(1)两个互为对比的颜色如红和绿,靠近并置在一起时,它们各自的色彩都在视觉上加强了饱和度,显得色相、纯度更强烈。
(2)这两个色彩调和后成为明度、纯度都降低的中性灰黑,这种灰黑色是这一组对比色互相连结的最调和的颜色。

色彩三要素
不论哪种色彩,都具备三个基本的重要性质:色相,明度,纯度。
1. 色相 (Hue)
又叫色名,即区分色彩的名称。根据光谱图来区分不同的色彩。1662年牛顿用三棱镜分解日光得到光谱图。光的波长决定色相。
2. 明度 (Value)
即色彩的明暗强度,光线强时,感觉比较亮,光线弱时,感觉比较暗。明度高指色彩较明亮,明度低指色彩较灰暗。明度分为九调,是明度变化的基本表现形式。光的振幅决定明度。
3. 纯度(Chroma)
又叫彩度,指色彩的纯度,指某色相含该色相的色素多少,纯度也称色彩的饱和度、彩度等,所含色素越多,纯度越高。在色彩鲜艳状况下,我们通常很容易感觉高彩度,但有时不易作出正确的判断,因为容易受到明度的影响。黑白灰没有纯度,只有明度。

如何配色我们来看看不同的颜色搭配在一起会产生怎样的效果?
1. 色相对比将相同的橙色,放在红色或黄色上,我们将会发现,在红色上的橙色会有偏黄的感觉,因为橙色是由红色和黄色调成的,当他和红色并列时,相同的成份被调和而相异部份被增强,所以看起来比单独时偏黄,以其他色彩比较也会有这种现象。



除了色感偏移之外,对比的两色,有时会发生互相色渗的现象,而影响相隔界线的视觉效果, 当对比的两色,具有相同的纯度和明度时,对比的效果越明显,两色越接近补色, 对比效果越强烈。
2. 明度对比
将相同的色彩,放在黑色和白色上,比较色彩的感觉,会发现黑色上的色彩感觉比较亮,放在白色上的色彩感觉比较暗,明暗的对比效果非常强烈明显,对配色结果产生的影响,明度差异很大的对比,会让人有不安的感觉。

3. 纯度对比
色彩和另一纯度较高的色彩并列时,会觉得本身纯度变低,而和另一个纯度较低的色彩时,会觉得纯度变高。
4. 补色对比
两个互为补色的色彩在一起时,会产生明显的效果,使色彩彼此色感更强。

5. 面积对比
将两个色彩强弱不同的色彩放在一起,若要得到对比均衡的效果,必须以不同的面积大小来调整,弱色占大面积,强色占小面积,而色彩的强弱是以其明度和纯度来判断。

色彩与心理感受1. 暖与冷
暖色:红色、橙色、黄色,象征着:太阳、火焰。
冷色:绿色、兰色、黑色,象征着:森林、大海、蓝天。
中间色:灰色、紫色、白色。
冷色调的亮度越高越偏暖,暖色调的亮度越高越偏冷。
2.兴奋与沉静
橙色:给人活泼、愉快、兴奋的感受。
青色、青绿色、青紫色:让人感到安静、沉稳、踏实。
3.前进与后退
色彩可以使人有距离上的心理感觉。
排列如下:红色 > 黄色≈橙色 > 紫色 > 绿色 > 青色。
暖色为前进色:膨胀、亲近、依偎的感觉。
色彩明亮有前进的感觉,色彩灰暗有后退的感觉。
冷色为后退色:镇静、收缩、遥远的感觉。
在家庭装修中,面积较小的房间要选用“暗色调的地板”,使人有面积扩大的感觉。如果选用明亮色彩的地板就会显得空间狭窄,增加压抑感。
4.轻与重
色彩可以给人带来“轻与重”的感觉。
白色和黄色给人感觉较轻,而红色和黑色给人感觉较重。
在家装中,居室的顶部(天花)易选用浅颜色或较亮的色调;而墙和地面可适当加重,否则给人头重脚轻的感觉。
5.柔和与强硬
暖色感觉柔和、柔软,冷色给人坚实、强硬;中性为过度色。

2008年10月2日星期四

ASF_007:Web Services Project的优秀子项目介绍


  1. Axis - an implementation of the Simple Object Access Protocol (SOAP).

  2. Axis2 - a redesign of Axis (1.X) supporting SOAP 1.2/SOAP1.2/REST/and more.

  3. WSIF - a simple Java API for invoking Web services, no matter how or where the services are provided.

  4. WSS4J - an implementation of the OASIS Web Services Security (WS-Security) from OASIS Web Services Security TC.

ASF_006:Tomcat介绍

ASF_005:Jakarta Project的优秀子项目介绍


  1. JMeter Pure Java desktop application designed to load test functional behavior and measure performance。

ASF_004:Maven介绍

2008年10月1日星期三

ASF_002:Commons Project的优秀组件介绍


  1. BeanUtils Easy-to-use wrappers around the Java reflection and introspection APIs.

  2. DBCP Database connection pooling services.

  3. DbUtils JDBC helper library.

  4. Digester XML-to-Java-object mapping utility.

OpenSource_001:各种开源软件协议介绍(摘录+整理)

在介绍大名鼎鼎的 Apache Software Foundation 之前有必要介绍一下各种开源软件协议。
提到开源软件,往往有一个误解:“连源码都可以拿到,我是不是可以为所欲为了呢?”
——当然不是,因为开源不等于免费! 那么,使用开源软件都有哪些要求呢?
别急,在介绍各种开源软件协议之前又不得不提GNU这个“自由软件计划”。

【GNU】GNU是“GNU's Not Unix”的递归缩写。
创始人:Richard Stallman
时间:1983年9月27日。
目标:创建一套完全自由的操作系统。
理由:“重现当年软件界合作互助的团结精神”。
为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有这样一个条款:禁止任何人对GNU软件添加任何限制。这就是GNU通用公共许可证(GNU General Public LicenseGPL),简单的说,就是必须“开源+免费”。
FSFFree Software Foundation 自由软件基金会
为了给GNU计划提供技术、法律以及财政支持,Richard Stallman1985年又创立了FSF

OSIOpen Source Initiative 开源促进会
The Open Source Initiative is an organization dedicated to promoting open-source software.”
(摘自http://en.wikipedia.org/wiki/Open_Source_Initiative)
属于OSI-Approvedlicenses有很多,像大家经常看到的ApacheGPLLGPLMIT。OSI 的要求之一是二进制文件和源代码的自由发放。
详细信息请访问:http://en.wikipedia.org/wiki/Open_source_license 或 http://www.opensource.org/licenses。

1. GPL License:GNU General Public License
允许自由地“使用、复制、修改和发布”,但修改和发布后的软件也必须是可以自由“使用、复制、修改和发布”的。因此 GPL 大大限制了商业软件使用GPL授权的软件,如果非法使用,将面临起诉的风险。目前 GPL 授权的项目有:linux、gnome、kde、Emacs、gcc。
GPL 的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售,即必须也是开源和免费,这就是所谓的”传染性”
由于 GPL 严格要求使用了 GPL 类库的软件产品必须使用 GPL 协议,对于使用 GPL 协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

2. LGPL License Library/Lesser GPL
LGPL 是一个主要为类库使用设计的开源协议,是 GNU 为了得到商用软件开发商的支持而提出的。与 GPL 的最大不同是,LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。即允许商业软件使用 LGPL 授权的自由软件,开发出来的新软件可以是私有的!
但是如果修改或衍生 LGPL 授权的代码,则所有修改和衍生的代码都必须符合 LGPL。因此 LGPL 协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。
LGPL 鼓励大家尽可能广泛地使用一些特定的函数库,使它成为实际上的标准。

小结:GPL/LGPL在大力倡导知识共享的同时也十分注重保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。详细信息请访问:http://www.gnu.org/licenses/gpl.html

3. BSD开源协议
BSD 开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但“为所欲为”的前提当你发布使用了 BSD 协议的代码,或则以 BSD 协议代码为基础做二次开发自己的产品时,需要满足三个条件:
(1)如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的 BSD 协议。
(2)如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的 BSD 协议。
(3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD 由于允许使用者修改和重新发布代码,也允许使用或在 BSD 代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选 BSD 协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

4. Apache Licence 2.0
Apache Licence是著名的非盈利开源组织 Apache 采用的协议。该协议和 BSD 类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和 BSD 类似:
(1)需要给代码的用户一份 Apache Licence。
(2)如果你修改了代码,需要再被修改的文件中说明。
(3)在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
(4)如果再发布的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有 Apache Licence。你可以在 Notice 中增加自己的许可,但不可以表现为对 Apache Licence 构成更改。
(5)Apache Licence 也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

5. MIT
MIT 是和 BSD 一样宽范的许可协议,作者只想保留版权,而无任何其他了限制。也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。

问题1:MySQL是否免费?
MySQL同时拥有Commercial LicenseGPL License。如果是GPL项目,那么可以免费使用;如果是商业软件项目,则要购买Commercial License

问题2:共享软件是否免费?共享软件是以“先使用后付费”的方式销售的享有版权的软件。这类软件一般是由个人开发完成,一般会对软件使用进行一定限制:如只能使用30天,或者某些高级功能无法使用。用户可以先试用,认为满意后再向作者付费,从而获得无限制的软件。

参考文献
1. http://www.awflasher.com/blog/archives/939
2. http://www.gnu.org/
3. http://www.fsf.org/
4. http://baike.baidu.com/link?url=8FpuiTcQzNvgkapxGBsqFtewe6feroTYUhkycaSGggk9wcVn3ooDFR6VJwr8h81glrCapTS7IJRytp-kpthYXq
5. http://www.chinaz.com/web/2009/1219/101662.shtml
6. http://blog.csdn.net/nightmare/article/details/12405109

2008年9月26日星期五

JVM_026:Java 与 64位架构 (翻译+整理)

本文译自《Java and 64-Bit Architetures》,时间仓促,没有逐句翻译,不当之处,敬请原谅。

1. 为什么我们需要64位架构?
一直以来,如何处理呈几何级数增长的海量数据不仅仅是Java开发者面临的挑战,而且是硬件和软件制造商同样面临的挑战。今天,我们见证了一个计算机发展史上的进化: 从32位架构转移到64位架构。在过去的15年里, 32位架构被认为是足够运行大多数的企业应用;但是,今天日新月异的业务领域对系统提出了更高的需求,因此64位架构应需而生。
64位硬件已经成为了工业标准,CPU 如IBM Power、Sun SPARC以及Intel Itanium都已经支持64位, 包括AMD Opteron chips 和 Intel Xeon EM64T chips。除了硬件,操作系统厂商如Microsoft、HP、IBM、Sun 以及 Linux都已经有了64位的产品。只有64位的JVM发展相对落后。今天,64位的JVM仍然很少见,并且只使用在特别领域中,比如那些需要超大Heap空间的应用。

2. 64位架构如图所示,底层是64位的,上层可以选择32位的;反过来则不行。可以看出,要想安装64位的JVM,操作系统和硬件必须都是64位的才行。

3. 使用64位架构的好处
理论上,32位最多支持4G内存(2的32次方),64位最多支持内存(2的64次方)。
下图展示Heap大小与GC的关系:
可以看出,Heap=1.5G时的GC所占用的时间几乎是Heap=13.5G的5倍。也就是说,Heap=13.5G时的吞吐率是Heap=1.5G时的5倍。
但是,评估GC好坏的另一个指标是GC暂停时间,而
GC暂停时间与两个因素有关:Heap大小和“活对象“的数量。一方面,Heap越大,GC暂停时间越长;另一方面,Heap越大,活对象“的数量越小,数据访问集中在内存中,访问硬盘的几率很小,因此GC暂停时间越小。

4. 使用64位架构的成功案例
目前已经证实的是,64位架构已经在金融领域(如银行、保险、投资)、科学领域(如地理信息系统)中大显身手。这里有两个成功案例:
(1)野外勘探测量:海量数据处理。
(2)金融产品风险评估:海量数据计算。

5. 64位不是万能的

6. 移植到64位
从32位移植到64位的主要问题是JNI native code:
如果使用了32位的JNI native code,则移植到64位上会有问题,因为32位的JNI native code无法运行在64位的操作系统中。
你需要在64位平台上重新编译32位的JNI native code,如果你有源代码。如果没有源代码,则无法移植。


7. 64位适合你吗?
当你有如下需求时,可以考虑使用64位:
(1)
需要Heap空间超过4 GB。
(2)GC时间过长(由于Heap空间过小的缘故)。

(3)海量数据计算
当你有如下需求时,可以考虑使用32位:
(1)
4 GB的Heap空间足够用。
(2)希望GC暂停时间越小越好。

下图展示了在32位和64位架构下,Server端Java应用的性能比较(前提:1G的Heap足够用):

下图展示了在32位和64位架构下,Client端Java应用的性能比较(前提:1G的Heap足够用):
下图展示了在32位和64位架构下,Java应用的性能比较(前提:1G的Heap不够用):

2008年9月25日星期四

JVM_025:JIT 是啥东东?

【JIT】:Just In Time,即时编译。
JIT能够加速Java程序的执行速度。大家知道,javac将程序源代码编译成java字节码,即class文件,JVM通过解释字节码将其翻译成对应的机器指令,逐条读入,逐条解释翻译。

很显然,经过解释执行,其执行速度必然会比可执行的二进制字节码程序慢。为了提高执行速度,引入了JIT。
JIT 编译过程如下:JVM读入字节码文件后,将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码,下图展示了该过程。

2008年9月22日星期一

JVM_023:JVM GC 调优举例(摘录+整理)

1. 前后两次GC的间隔是否太短?
运行 java -verbose:gc -Xloggc:gc.log BigObject,文件内容如下:
69.713: [GC 11536K->11044K(12016K), 0.0032621 secs]
69.717: [Full GC 11044K->5143K(12016K), 0.1429698 secs]
首列是JVM 开始后的秒数和毫秒数的时间戳,方括号中含义的依次为:收集的类型 GC之前活动对象所占大小 GC之后活动对象所占大小 Heap总大小(不包括永久代) 本次GC持续的时间。
可以看出第一次GC为一个minor收集, 在GC开始之前,JVM运行了69.713 秒,使用了11536 Kb 的Heap空间。在完成时,使用了11044 Kb,Heap总空间为12016 Kb,而整个收集用了0.0032621 秒。
第二次GC为一个完全收集,在 69.717 秒时发生,即在上一次GC之后0.004 秒开始。注意,如果将上一次minor GC的持续时间加到其开始时间上,就会看到在上次minor收集是在本次完全收集之前不到1毫秒结束。可以得出结论:minor收集没有筹集到足够的空间,并因此触发了完全的 GC。对应用程序来说,就好像一直持续了0.1462319 秒的GC收集。
优化提示:提高年轻代的大小。建议:年轻代的大小为整个Heap空间的3/8。

2. 年轻代的回收率是否低于70%?
运行java -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails BigObject,输出结果如下
[GC [DefNew: 3968K->64K(4032K), 0.0923407 secs] 3968K->2025K(32704K), 0.0931870 secs]
可以看出,Minor收集在年轻代中中找回3904K(3968K->64K),整个Heap空间找回1943K (3968K->2025)。Minor收集了大约50%(1943/3904)的对象,而另外的50%的对象则被移到了年老代。
优化提示:适当提高年轻代的大小,观察年轻代回收率是否提高。年轻代的minor收集率应在70%以上

3. 应用暂停时间是否过长?
运行 java -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime BigObject,输出结果如下:
Application time: 0.5114944 seconds
[GC [DefNew: 3968K->64K(4032K), 0.0823952 secs] 3968K->2023K(32704K), 0.0827626 secs]
Total time for which application threads were stopped: 0.0839428 seconds
年轻代的Minor收集占用的时间比率计算如下:
应用线程被中断的总时长/(应用执行总时长 + 应用线程被中断的总时长)。
那么在本例中垃圾收集占用的时间比率为:0.0839428 /(0.5114944 + 0.0839428 ) = 14%;
垃圾收集占用的时间的比率越大,系统的响应越慢。
优化提示:适当提高年轻代的大小;改变收集方式。

4. 如何缩短minor收集暂停时间?运行 java -XX:+PrintGCDetails -XX:+UseParNewGC BigObject。

5. 如何缩短major收集暂停时间?运行 java -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC BigObject
6. 如何缩短收集暂停时间?运行 java -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC BigObject
7. 如何提高GC的吞吐量?
机器配置:4G的内存,32个CPU。
java -Xmx3200m -Xms3200m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20,说明如下:
(1)-Xmx3200m -Xms3200m 配置了最大Heap来充分利用系统内存。
(2)-Xmn2g 创建足够大的年轻代,防止将短期对象复制到年老代。
(3)-Xss128 减少默认最大的线程栈大小,提供更多的处理虚拟内存地址空间被进程使用。
(4)-XX:+UseParallelGC 采用并行垃圾收集器对年青代的内存进行收集,提高效率。
(5)-XX:ParallelGCThreads=20 减少垃圾收集线程,默认是和CPU个数相同,往往不需要配置到最大值。

8. 采用对年老代并行收集,JDK1.6支持。机器配置:4G的内存,32个CPU。
java -Xmx3000m -Xms3000m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC,说明如下:
(1)-Xmx3000m -Xms3000m 内存分配被减小,因为ParallelOldGC会增加对于Native Heap的需求,因此需要减小Java Heap来满足需求。
(2)-XX:+UseParallelOldGC 采用对于老年代并发收集的策略,提高收集效率。

9. 既提高吞吐量,又减少应用暂停时间
机器配置:4G的内存,32个CPU。
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31
(1)-XX:+UseConcMarkSweepGC -XX:+UseParNewGC 选择了并发标记交换收集器,它可以并发执行收集操作,降低应用暂停时间,同时它也是并行处理模式,有效地利用多CPU的处理能力。
(2)-XX:SurvivorRatio=8 年轻代中Eden和Survivor比例,两个Survivor区与一个Eden区的比值为2:8。Survivor越大,短期对象在年轻代被回收的可能性越高。
(3)-XX:MaxTenuringThreshold=31 熬过年轻代31次收集后才进入年老代,提高短期对象在年轻代被回收的可能性。
(4)-XX:TargetSurvivorRatio=90 允许使用90%的Survivor区空间,超过默认的50%,提高Survivor区的使用率。

10. 当系统负载与GC“共振”时,如何解决?在《优化Java 垃圾收集器改进系统性能》这篇文章中,任务数与GC发生“共振”:任务数比较高时,JVM开始GC,导致更多的任务无法被处理。通过减少Heap的最大值,降低每次GC所花的时间,提高GC的次数,使其与任务数的频率不一致。从而使CPU有时间可以处理更多的任务。
参考文献:
1. 《
JVM调优》。

2008年9月21日星期日

JVM_022:Heap 大小调优(摘录+整理)

1. Heap 空间的最大值可以是多少?
这个需要测试,可以运行命令 java -Xms<nnnn>M -Xmx<nnnn>M -version 来测试,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。
32位操作系统下,一般限制在1.5G~2G;64位操作系统则无限制。

2. 把-Xms和-Xmx设置成相等,避免每次GC后,JVM调整Heap的大小。

JVM_021:Heap 大小调优举例(摘录+整理)

1. Heap空间最大值不要超过物理内存的80%。

2. 把-Xms和-Xmx设置成相等以避免在每次GC后JVM调整Heap的大小。

2008年9月20日星期六

JVM_021:JVM 调优

JVM 调优主要包括以下几个方面:

1. 堆大小(heap sizing)

2. 垃圾回收(Garbage collection)

3. 栈大小(Stack size)

4. 类装载(Class loading)

5. 编译器/解释器(Compilation/interpretation)

2008年9月16日星期二

JVM_020:在Eclipse中使用JRockit Mission Control

1. 配置JRockit JVM 作为Eclipse的Java VM
(1)启动脚本
eclipse.exe -clean -vm [jrockit_home]\bin\java.exe -vmargs -Xms256M -Xmx512M -XgcPrio:deterministic -XpauseTarget:20 -XXcompactratio:1
(2)增加JRockit JRE,并将其设为默认的JRE。


2. 为Eclipse安装JRockit Mission Control Plugin

Help > Software Updates > Find and Install

Search for new features to install

New Remote Site

New Update Site,输入 http://www.oracle.com/technology/software/products/jrockit/missioncontrol/updates/base/3.1.0/eclipse/





JVM_019:JRockit Memory Leak Detector 使用说明

JRockit Memory Leak Detector 的趋势分析器可以发现非常慢的泄漏,它显示详细的Heap统计信息(包括泄漏对象的引用类型和实例,分配点),并可快速追溯泄漏的原因。
内存泄漏检测程序使用先进的图形表示技术,简化了复杂信息的浏览和理解。

那么,如何使用JRockit Memory Leak Detector 呢?
说明:本实验使用的JRockit Mission Control的版本为4.0.0。

1. 使用前的环境准备
(1)设置JAVA_HOME为JRockit所在目录。
(2)设置PATH=%JAVA_HOME%\bin;%PATH%
(3)运行 java -version 确认使用的JVM的确是 JRockit,以及具体版本。
(4)运行 java -Xpausetarget=30ms -Xverbose:gc DemoLeak。
(5)运行 启动 JAVA_HOME\bin\jrmc.exe。
(6)找到本地连接的Java程序DemoLeak,右键选择 Start Memleak。

2. 观察
JRockit Memory Leak Detector 有6个tab,分别是:

  • 趋势
  • 类型图形
  • 类型树
  • 实例图形
  • 实例树
  • 分配
下面,我们就具体看一看如何适用这几个Tab。
趋势分析显示了Heap中最常见的对象类型、 对象类型的增长率、对象类型的实例数、所占内存大小 。趋势分析的运行时间越长,趋势就越可靠。
各个类型是按照增长速率的顺序排列的,我们最关注的当然是增长率最高的类型——这些类型很可能就是引起内存泄漏的类型。
可以看出,上图中增长率排在前三位的是:DemoLeak$DemoObject 、Hashtable$Entry 、Hashtable$Entry[] 。
到底是哪个对象类型引起了内存泄漏呢?仔细观察,我们发现DemoLeak$DemoObject 与Hashtable$Entry 实例数大致相当,因此我们可以推测Hashtable$Entry 中存放的就是DemoObject。 

为了证实推测,右键点击DemoLeak$DemoObject ,选择“添加到类型图形”,看看有哪些类型指向了DemoObject。
在类型图形Tab中,我们展开指向DemoObject的所有节点,发现只有Hashtable$Entry——我们的猜测是对的!


继续展开指向Hashtable$Entry 的所有节点,发现只有Hashtable$Entry[]。右键Hashtable$Entry[],选择“列出最大数组”——因为最大的数组最可能引起内存泄露!

右键最大数组,选择“添加到实例图形”,发现有一个HashTable指向该数组。继续展开全部节点——有两个DemoThread 对象引用了该HashTable。
说明:本实验过程中断了一次,故最大数组新显示为12287,就是前面所指的393215。

右键其中一个DemoThread,选择“检查实例”。发现第一个参数是table,且指向该有问题的数组。
分析至此,我们基本找到问题的源头了——就是DemoThread.java中的table属性。剩下的工作就是分析该table属性,在哪个地方被不正确地使用了,最终导致了这个可疑的最大数组的产生。


3.  DemoLeak.java
import java.util.Hashtable;
import java.util.List;
import java.util.ArrayList;

/*
 * Copyright (c) 2007 by BEA Systems, Inc. All Rights Reserved.
 *
 * Created on 2003-dec-04
 */

/**
 * Simple MemLeak demo
 */
public class DemoLeak {
    private static class DemoObject {
        private long position;
        long myField1 = 1;
        long myField2 = 2;

        public DemoObject(int pos) {
            position = pos;
        }

        public int hashCode() {
            return (int)position;
        }

        public boolean equals(Object o) {
            return (o instanceof DemoObject) && (o.hashCode() == position);
        }
    }

    private static class AllocThread extends Thread {
        public void run() {
            while (true) {
                List junkList = new ArrayList();
                for (int i = 0; i < 1000; i++) {
                    junkList.add(new Object());
                    for (int j = 0; j < 10; j++)
                        Thread.yield(); // Keep busy yielding for a little while...
                }
            }
        }
    }

    private static class DemoThread extends Thread {
        private Hashtable table;

        DemoThread(Hashtable h) {
            table = h;
        }

        public void run() {
            int total = 0;
            while (true) {
                for (int i = 0; i <= 100; i++)
                    put(total + i);

                for (int i = 0; i < 100; i++)
                    remove(total + i);
                total += 101;

                for (int i = 0; i < 10; i++)
                    Thread.yield(); // Keep busy yielding for a little while...
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                }
            }
        }

        private void put(int n) {
            table.put(new DemoObject(n), "foo");
        }

        private String remove(int n) {
            return (String)table.remove(new DemoObject(n));
        }
    }

    public static void main(String[] args) {
        Hashtable h = new Hashtable();
        Thread[] threads;

        if (args.length != 1) {
            threads = new Thread[2];
        } else {
            threads = new Thread[Integer.parseInt(args[0])];
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new DemoThread(h);
            threads[i].start();
        }
        new AllocThread().start();
    }
}

JVM_018:JRockit Runtime Analyzer 使用说明

JRockit Runtime Analyzer 类似于航空中飞行记录器,它可以按照你的需要定制,生成关于JVM及其上运行的应用程序的详细记录。
记录的档案可供以后脱机分析。记录的数据包括方法和锁定的分析,以及垃圾回收统计、优化决策、对象统计和延迟事件。

那么,如何使用JRockit Runtime Analyzer呢?
说明:本实验使用的JRockit Mission Control的版本为3.0.3。

1. 使用前的环境准备
(1)设置JAVA_HOME为JRockit所在目录。
(2)设置PATH=%JAVA_HOME%\bin;%PATH%
(3)运行 java -version 确认使用的JVM的确是 JRockit,以及具体版本。
(4)运行 java -Xpausetarget=30ms DemoLeak。
(5)运行 启动 JAVA_HOME\bin\jrmc.exe。
(6)找到本地连接的Java程序DemoLeak,右键选择 Start JPA Recording。做一些必要的设置后,点击Start就可以了。

2. 观察

JRockit Runtime Analyzer有8个tab,分别是:
  • General
  • Method
  • GC general
  • GC
  • Heap
  • Optimizations
  • Lock Profiling
2.1 General
2.2 Method
按顺序排列占用CPU时间最多的方法,以及调用该方法之前和之后的方法。 2.3 GC general
可以查看哪些方法引起了GC。
2.4 GC
可以查看最长的暂停时间是多少?2.5 Heap
“暗物质”指被浪费的堆内存,它使堆成为许多碎片。应当尽量减少“暗物质”。
2.6 Object Statistics
比较记录前和记录后各个对象的数量和大小变化。
2.7 Optimizations
看看哪些方法被JRockit JVM优化了。一般优化后的代码比优化前的代码要大,这是因为
2.8 Lock Profiling
列出应用和JVM中有哪些锁。

JVM_017:JRockit Management Console 使用说明

JRockit Management Console 管理控制台是用于监控和管理多个 JRockit 实例的工具。
它可以捕获并显示关于 GC 暂停、内存和 CPU 使用情况的实时数据,以及来自JVM 内部 MBean 服务器上部署的任何 JMX MBean 的信息
JVM 管理包括动态控制 CPU 亲和性、垃圾回收策略、内存池大小等。

那么,如何使用JRockit Management Console呢?
说明:本实验使用的JRockit Mission Control的版本为3.0.3。

1. 使用前的环境准备
(1)设置JAVA_HOME为JRockit所在目录。
(2)设置PATH=%JAVA_HOME%\bin;%PATH%
(3)运行 java -version 确认使用的JVM的确是 JRockit,以及具体版本。
(4)运行 java -Xpausetarget=10ms DemoLeak。
(5)运行 启动 JAVA_HOME\bin\jrmc.exe。
(6)找到本地连接的Java程序DemoLeak,右键选择 Start Console。

如果希望远程监控JRockit JVM:java -Xmanagement:port=7091,ssl=false,authenticate=false DemoLeak。

如果希望远程自动发现JRockit JVM:java -Xmanagement:port=7091,ssl=false,authenticate=false,autodiscovery=true DemoLeak。

2. 观察
JRockit Management Console有8个tab,分别是:
  • Overview
  • MBean Browser
  • Memory
  • Threads
  • Runtime
  • Triggers
  • Exception Count
  • Method Profiler
2.1 Overview tab


2.2 MBean Browser tab
2.3 Memory tab可以观察Heap、内存、GC的使用情况。
参数说明:

(1)Available physical memory:还有多少物理内存可供使用。
(2)Allocated heap size target:Heap总大小(可以动态更改)。
(3)Used physical memory:已使用的物理内存。
(4)Used Java heap:已使用的Heap大小。
(5)Available Java heap:还有多少Heap可供使用。

2.4 Threads tab
2.5 Runtime tab
2.6 Triggers tab可以设置暂停时间触发器,超过设置时间将会触发警告窗口。
特别适合GC反复调优时,长时间监测暂停时间,直到满意为止。


2.7 Exception Count tab
2.8 Method Profiler tab用于监测指定类的指定方法在一定时间内调用了多少次,花费了多少时间。