<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>石无言 &#187; JAVA</title>
	<atom:link href="http://www.hugstone.com/index.php/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hugstone.com</link>
	<description>三生石前问一声，人间哪里修正果！</description>
	<lastBuildDate>Wed, 28 Jul 2010 02:11:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Linux系统中JVM内存2GB限制的原因</title>
		<link>http://www.hugstone.com/index.php/archives/479</link>
		<comments>http://www.hugstone.com/index.php/archives/479#comments</comments>
		<pubDate>Fri, 05 Mar 2010 15:07:34 +0000</pubDate>
		<dc:creator>stone</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JVM]]></category>

		<guid isPermaLink="false">http://www.hugstone.com/?p=479</guid>
		<description><![CDATA[(转载：http://www.javaeye.com/topic/368213 )
接触到的一些用户反映在Linux系统中运行的Java应用，内存只能使用到2GB，在Java虚拟机中如果把-Xmx参数设置到2GB左右（约1.5-1.8GB），java进程就根本启动不了。我们通常使用的JVM都是32位[......]<p class='read-more'><a href='http://www.hugstone.com/index.php/archives/479'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>(转载：http://www.javaeye.com/topic/368213 )</p>
<p>接触到的一些用户反映在Linux系统中运行的Java应用，内存只能使用到2GB，在Java虚拟机中如果把-Xmx参数设置到2GB左右（约1.5-1.8GB），java进程就根本启动不了。我们通常使用的JVM都是32位的（64位的JVM会损失10-20%的性能，通常不建议使用），而32位程序的寻址空间应该是4GB才对，为什么Linux上的JVM只能使用2GB的内存呢？ （注：Windows上也有类似的问题）</p>
<p>经过和JDK研发组的人员沟通，终于弄清楚了一些相关的原因。这个问题存在于早期的一些Linux版本中，特别是内核2.5以前的版本，2.6以后的版本就基本上没有这个问题了。原来这些Linux版本多是32位的，内核使用了2GB空间，应用进程就只有2GB了，也就是说一个地址连续的内存块大小的上限是2GB，而JVM的堆空间（heap size）需要连续的地址空间，因此，2GB就是java进程的理论使用的内存上限。</p>
<p>如果java应用需要使用较大的内存，建议使用较新版本的linux，或者修改Linux的应用/内核内存比配置为3GB：1GB。还有就是选择如Solaris等的UNIX操作系统。象Solaris这样的操作系统，在内存管理上没有2GB的限制，因此可以把heap size设置到3.5-3.6GB左右。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hugstone.com/index.php/archives/479/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SUN JDK JVM Heap</title>
		<link>http://www.hugstone.com/index.php/archives/449</link>
		<comments>http://www.hugstone.com/index.php/archives/449#comments</comments>
		<pubDate>Thu, 14 Jan 2010 12:27:53 +0000</pubDate>
		<dc:creator>stone</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[Heap]]></category>
		<category><![CDATA[JAVA]]></category>
		<category><![CDATA[JVM]]></category>

		<guid isPermaLink="false">http://www.hugstone.com/?p=449</guid>
		<description><![CDATA[<img class="size-medium wp-image-450" title="JVM Heap" src="http://www.hugstone.com/wp-content/uploads/2010/01/Heap.gif" alt="JVM Heap" width="477" height="280" />
(1)young generation
年轻代分三个区。一个Eden区，两个Survivor区。大部分对象在 Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区（两个中的一个），当这个Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Sur[......]<p class='read-more'><a href='http://www.hugstone.com/index.php/archives/449'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><img class="size-medium wp-image-450" title="JVM Heap" src="http://www.hugstone.com/wp-content/uploads/2010/01/Heap.gif" alt="JVM Heap" width="477" height="280" /></p>
<p>(1)young generation</p>
<p>年轻代分三个区。一个Eden区，两个Survivor区。大部分对象在 Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区（两个中的一个），当这个Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Survivor区也满了的时候，从第一个Survivor区复制过来的并且此时还存活的对象，将被复制到tenured generation。需要注意，Survivor的两个区是对称的，没先后关系，所以同一个区中可能同时存在从Eden复制过来对象，和从前一个Survivor复制过来的对象，而复制到年老区的只有从第一个Survivor去过来的对象。而且，Survivor区总有一个是空的。<br />
young generation的gc称为minor gc。经过数次minor gc，依旧存活的对象，将被移出young generation，移到tenured generation</p>
<p>(2)tenured generation</p>
<p>生命周期较长的对象，归入到tenured generation。一般是经过多次minor gc，还 依旧存活的对象，将移入到tenured generation。（当然，在minor gc中如果存活的对象的超过survivor的容量，放不下的对象会直接移入到tenured generation）<br />
tenured generation的gc称为major gc，就是通常说的full gc。<br />
采用compaction算法。由于tenured generaion区域比较大，而且通常对象生命周期都比较长，compaction需要一定时间。所以这部分的gc时间比较长。<br />
minor gc可能引发full gc。当eden＋from space的空间大于tenured generation区的剩余空间时，会引发full gc。这是悲观算法，要确保eden＋from space的对象如果都存活，必须有足够的tenured generation空间存放这些对象。</p>
<p>(3)permanent generation</p>
<p>该区域比较稳定，主要用于存放classloader信息，比如类信息和method信息。<br />
对于spring hibernate这些需要动态类型支持的框架，这个区域需要足够的空间。(这部分空间应该存在于方法区而不是heap中)。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hugstone.com/index.php/archives/449/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA 相关术语</title>
		<link>http://www.hugstone.com/index.php/archives/424</link>
		<comments>http://www.hugstone.com/index.php/archives/424#comments</comments>
		<pubDate>Thu, 17 Dec 2009 03:09:38 +0000</pubDate>
		<dc:creator>stone</dc:creator>
				<category><![CDATA[Note]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.hugstone.com/?p=424</guid>
		<description><![CDATA[<strong>JDK</strong>
Java Development Kit ,JAVA的开发工具包
JDK 是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment,JRE），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因[......]<p class='read-more'><a href='http://www.hugstone.com/index.php/archives/424'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>JDK</strong><br />
Java Development Kit ,JAVA的开发工具包<br />
JDK 是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment,JRE），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握 JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。</p>
<p><strong>J2EE</strong><br />
J2EE Java2平台企业版（Java 2 Platform,Enterprise Edition）<br />
J2EE是一套全然不同于传统应用开发的技术架构，包含许多组件，主要可简化且规范应用系统的开发与部署，进而提高可移植性、安全与再用价值。<br />
 J2EE核心是一组技术规范与指南，其中所包含的各类组件、服务架构及技术层次，均有共通的标准及规格，让各种依循J2EE架构的不同平台之间，存在良好的兼容性，解决过去企业后端使用的信息产品彼此之间无法兼容，导致企业内部或外部难以互通的窘境。<br />
<strong>J2SE</strong><br />
J2SE商业版本，标准版本 (Java2 Standard Edition) 定位在客户端，主要用于桌面应用软件的编程。<br />
J2SE 包含那些构成Java语言核心的类。<br />
比如：数据库连接、接口定义、输入/输出、网络编程<br />
J2SE 是J2EE的基础，他大量的JDK代码库是每个要学习J2EE的编程人员必须掌握的。</p>
<p><strong>J2ME</strong><br />
Java 2 Micro Edition 概念<br />
J2ME(Java 2 Micro Edition)是Java 2的一个组成部分，它与J2SE、J2EE并称。根据Sun的定义：J2ME是一种高度优化的Java运行环境，主要针对消费类电子设备的，例如蜂窝电话和可视电话、数字机顶盒、汽车导航系统等等。J2ME技术在1999年的JavaOne Developer Conference大会上正式推出，它将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。<br />
J2ME 在设计其规格的时候，遵循着「对于各种不同的装置而造出一个单一的开发系统是没有意义的事」这个基本原则。于是 J2ME 先将所有的嵌入式装置大体上区分为两种 :一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA 、手机)；另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机上盒 (set-top box))。因为这两种型态的嵌入式装置，所以Java 引入了一个叫做Configuration 的概念，然后把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中；而另外一种装置则规范为 Connected Device Configuration(CDC)规格。也就是说， J2ME 先把所有的嵌入式装置利用Configuration 的概念区隔成两种抽象的型态。</p>
<p> </p>
<p><strong><span style="color: #ff0000;">*.  JDK是统称, 分为J2SE、J2ME、J2EE</span></strong></p>
<p><strong><span style="color: #ff0000;">在Java1时期,JDK就是指一个JAVA的开发工具包.<br />
随着Java平台的不断发展, Java2的诞生,Java2平台被分为三大块：J2SE，J2EE，J2ME.每一块都有自己相应的开发工具包(即每块都有自己的JDK).  <br />
</span></strong></p>
<p><strong><span style="color: #ff0000;">J2SDK是Java 2 Software Devolop Kit(Java2软件开发包), J2SDk包含了Java Development kit(JDK)、Java Runtime Environment(JRE)和Java Plug-in。原先sun的JAVA软件开发工具包是JDK，<strong><span style="color: #ff0000;">在Java2诞生之后</span></strong>就称为J2SDk了 (到现在为止,很多人还将之简称为JDK) 。  J2SE，J2EE，J2ME开发需分别使用相对应的软件开发包j2sdk/j2eesdk/j2mesdk.<br />
JDK是开发人员必装软件<br />
JRE是客户端运行时必装软件</span></strong></p>
<p><strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.hugstone.com/index.php/archives/424/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAVA 历史</title>
		<link>http://www.hugstone.com/index.php/archives/426</link>
		<comments>http://www.hugstone.com/index.php/archives/426#comments</comments>
		<pubDate>Thu, 17 Dec 2009 02:50:05 +0000</pubDate>
		<dc:creator>stone</dc:creator>
				<category><![CDATA[Article]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://www.hugstone.com/?p=426</guid>
		<description><![CDATA[<strong>J2SE历史回顾：JDK 1.1时代开始</strong>
Java的历史可以追溯到1991年4月，Sun公司的James Gosling领导的绿色计划(Green Project)开始着力发展一种分布式系统结构，使其能够在各种消费性电子产品上运行，他们使用了C/C++/Oak语言。由于电子产品种类繁多，运行环境各不[......]<p class='read-more'><a href='http://www.hugstone.com/index.php/archives/426'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>J2SE历史回顾：JDK 1.1时代开始</strong></p>
<p>Java的历史可以追溯到1991年4月，Sun公司的James Gosling领导的绿色计划(Green Project)开始着力发展一种分布式系统结构，使其能够在各种消费性电子产品上运行，他们使用了C/C++/Oak语言。由于电子产品种类繁多，运行环境各不相同，使得用这些语言进行开发的软件必须为不同的电子产品而专门设计，所以项目组疲于奔命，消费性电子产品软件环境的发展无法达到预期的目标，绿色计划也陷于停滞状态。</p>
<p>直至 1994年下半年，由于Internet的迅猛发展和环球信息网 WWW的快速增长，第一个全球信息网络浏览器Mosaic诞生了；此时，工业界对适合在网络异构环境下使用的语言有一种非常急迫的需求；Games Gosling决定改变绿色计划的发展方向，他们对Oak进行了小规模的改造，就这样，Java在1995年的3月23日诞生了！Java的诞生标志着互联网时代的开始，它能够被应用在全球信息网络的平台上编写互动性及强的Applet程序，而1995年的Applet无疑能给人们无穷的视觉和脑力震荡。</p>
<p>但没有相应的开发库而只靠Java语言来进行开发肯定是困难重重，所以Sun公司在1996年的1月23日发布了JDK1.0来帮助开发人员的开发。JDK包括两大部分：运行环境和开发工具。而运行环境包括五大部分：核心API，集成API，用户界面API，发布技术，Java虚拟机(JVM)。Java能够在信息网络时代快速发展，得益于它独特的组成结构，它并不直接被编译成所在平台的机器语言然后执行，而是先被编译成字节码，然后才到装有JVM的硬件上运行，所以它能够跨平台运行；而且，不是一定要使用Java语言来写程序才能编译成Java字节码，我们用C/C++/Javascript等语言来写程序也可以编译出JVM要求的字节码文件。在这个时期，人们使用最多的 Java API 无疑地就是 AWT，因为 JDK 1.0 时只有 AWT 称得上是一组完整的 framework，其它 Java API 都比较偏向个别的 class。</p>
<p>紧跟着，Sun公司在1997年2月18日发布了JDK 1.1。JDK 1.1相对于旧版本最大的改进，是推出了JIT(Just-In-Time)编译器。传统的JVM收到一道字节码指令后，解释成机器码，马上执行该机器码，然后丢掉该机器码，再接收下一道字节码指令……即便是以前执行过的字节码指令，依然需要重新解释成机器码才能执行。而JIT编译器会把常执行的部分先解释好放在内存，以后再次执行该指令时，不用再解释，直接从内存中取出机器码就可以执行了，这样提高了不少的效率。</p>
<p>在JDK 1.1时代，Java平台分为PersonalJava与EmbeddedJava，前者比较适用于运算资源和内存丰富的设备，而资源有限者适用于后者。这样的分类明显不符合时代发展的潮流，所以，Java平台处处蕴藏着新的翻天覆地的革命……</p>
<p><strong> J2SE 1.2的诞生与Java2时代三大革命</strong></p>
<p>JDK1.2在1998年12月4日的隆重发布，标志着Java2平台的诞生。Java2的J2SE 1.2时代是一个大变革时代，它进行了如下的三大革命：</p>
<p>* 市场推广革命</p>
<p>在Java1.0或者1.1中，称API库为JDK，但为了方便市场推广，Sun公司在Java1.2版以后将JDK1.2改名为J2SDK，将Java改名为Java 2。在99年Sun公司还将Java2平台分为三大块：J2SE，J2EE，J2ME。这次市场推广革命顺应了网络急速发展的潮流，对Java2平台的发展起到了很好的催化剂的作用。</p>
<p>* API供应标准革命</p>
<p>而随着供应商的不同，Java的API分为三大类：</p>
<p>Java Core API：由Sun公司制定的基本的API，所有的Java平台都应该提供。这就是我们平常所说的Java核心类库。</p>
<p>Java Optional API：由Sun公司制定的扩充API，Java平台可以有选择地提供。比如， JFC以前是Sun对JDK的功能扩展，不是Java的公共规范。Java2平台则包含了JFC技术,不需要再扩展了。</p>
<p>特殊API：由特殊厂商或者组织提供的API。比如，美国法律对出口中国的加解密算法的安全强度有一定的限制，Java平台中不能包括一些安全强度较高的加密解密算法，所以部分其它国家的公司，如加拿大的BouncyCastle公司等，可以提供一些自己的安全API。</p>
<p>* API制定过程的革命</p>
<p>如果你有需求不能通过遵循标准的API来实现,可以向 <a href="http://www.jcp.org/" target="blank">www.jcp.org</a> 提出制定新的API的请求,经过审核,你的请求可能被通过或者驳回;如果是被通过,则开始进入制定该API的程序。</p>
<p>J2SE 1.2时代进行的这些革命形成的制度一直沿用到现在,对Java技术的发展形成了深远的影响。</p>
<p>除了上述的三大革命，Java2 还支持并新增了许多新特性，最受追捧的当属Swing库。Swing 是轻量级 的 API，它不但有各式各样先进的组件，而且连组件风格都可抽换。Swing 出现之后，大家很快地就不太使用 AWT 了。但请不要以为 Swing 是用来取代 AWT 的，其实 Swing 是架构在 AWT 之上的， Swing 的出现只是减少程序员直接使用 AWT 的机会，而不会让 AWT 消失。Java2 还废弃了一些API，最重要的莫过于Thread类中对suspend(),resume()和stop()等方法的废弃。由于JDK1.1的集合类库中的Vector类和HashTable类都考虑了同步，在平常的使用中影响效率，所以Java2专门添加了对应的非同步类，并完善了集合类库。</p>
<p>Java2平台能够得到广泛的应用，还应归功于这个时期的一些优秀书籍，比如著名的《Core Java2》（卷一和卷二），该书随着JDK版本的变化已经出到第八版。</p>
<p><strong>J2SE 1.3时代：寻找盈利和开源的平衡</strong></p>
<p>Java2平台推出后，得到了市场的强烈反响，所以，在2000年5月8日推出的J2SE 1.3对J2SE1.2的改进，主要是对各种已有API的加强和对新API的拓展。</p>
<p>数字运算： 加入了java.lang.StrictMath,方便我们的一般的数字运算。</p>
<p>新的Timer API：相信大家对其中的java.util.Timer和java.util.TimerTask一定不陌生。</p>
<p>Collections包：??加入了一些新的API，方便我们的使用。</p>
<p>虚拟机停止钩子：J2SE1.3还加入了一个强大的功能，那就是虚拟机停止钩子(Virtual Machine Shutdown Hooks)，这个功能使得我们能够在虚拟机停止时完成我们自己的操作，比如关闭网络连接或者保存会话状态或者清除临时文件等等。</p>
<p>DNS服务：在JNDI接口方面，加入了一个DNS服务的实现。</p>
<p>Jini实现：J2SE1.3包含了一个Jini实现，这使得我们可以方便地把诸如打印机、摄像机和磁盘驱动设备插入现有网络中，并且能自动搜索已在网上的设备可以提供的服务并享用这些服务。</p>
<p>XML支持：由于计算机网络和XML技术的快速发展， J2SE1.3在Optional API中引入了Java API for XML包。</p>
<p>HotSpot虚拟机：J2SE1.3引入了HotSpot虚拟机。在solaris版的JDK1.3中，已经不支持传统的虚拟机，而windows版的JDK1.3同时支持传统虚拟机和HotSpot虚拟机。</p>
<p>从上面的分析可以看出，J2SE 1.3主要是对J2SE 1.2查漏补缺和拓展新的API。从应用领域方面考虑，J2SE 1.3已经涵盖了数据库、WEB、多媒体、网络、电话、影像、加解密、图形等等大部分的信息技术领域。</p>
<p>在这个时期Java2还有一个重要活动就是推出SCSL(Sun社区源代码许可)许可协议。Sun公司开放源代码项目的“女1号”Danese Cooper在1999年加入公司，负责Sun（包括Java）和开放源代码社区之间的协调工作。Sun一直尽可能在赢利和开放源代码之间寻求更好的平衡。</p>
<p>在J2SE 1.3时代，Java2平台得到了充分的发展，各大应用服务器在这个时代渐渐成熟并被广泛采纳，而Java2相关的培训和书籍更是如火如荼，《Thinking in Java》当属不得不推荐的一本。</p>
<p><strong>性能改善达到巅峰的J2SE 1.4</strong></p>
<p>J2SE 1.4平台的推出发生在2002年2月13日，由于此前在Java平台和.Net平台间发生了规模浩大的孰优孰劣的论战，而论战中，Java平台最大的缺点就是性能问题，所以J2SE 1.4平台把性能的改善放在了最重要的位置。</p>
<p>HotSpot虚拟机： HotSpot虚拟机能够很大程度上提高性能，所以J2SE 1.4已经不支持传统的虚拟机。现在，启动应用程序应该通过-client或者-server选项来启动，如果你还是通过-classic选项来启动，会收到这样的错误提示：”Error： Classic VM no longer supported。”</p>
<p>锁机制： 由于旧版的HotSpot虚拟机的锁机制会导制严重的性能和功能问题，J2SE 1.4已经改写了该锁机制。</p>
<p>安全API： Java Cryptography Extension(JCE),Java Secure Socket Extension(JSSE)和Java Authentication and Authorization(JAAS)这三大安全API从optional API移到了core API中。这样，J2SE 1.4的安全域(SecureRandom)实现可以利用操作系统提供的安全机制，以便缩短应用程序的启动时间。同时从optional API移到core API的功能还有XML处理API和JDBC2.0 API。</p>
<p>RandomAccess标记接口： 加入了RandomAccess标记接口，如果一个List实现了该接口，则表示它支持快速的随机访问，这样可以提高List访问的速度。</p>
<p>LinkedHashMap： 加入了LinkedHashMap，这是一个插入排序的Map实现，但它的运行速度和HashMap一样快。</p>
<p>反射： 很多产品中都要使用反射(Reflection)机制，但大家知道，反射是相当耗时的，所以，J2SE 1.4中重写了java.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()和Class.newInstance()等方法，使得我们利用反射也能写出高性能的应用程序。</p>
<p>64位计算： J2SE 1.4支持64位计算。64位支持使J2SE 1.4可以使用超过几百GB的内存，而以前的版本仅可以使用4G以内的内存。内存使用的扩大可以提高程序的运行效率。</p>
<p>新的I/O API： J2SE 1.4在API层面最大的变动，就是它更新了原有的java.io包，以及加入了一组更有效率更多功能的新的I/O API。旧的I/O处理是以串流(stream)的方式来存取的，以字节为单位，而新的I/O处理是以块(block)的方式来存取的。一个块可能包含了512字节，而磁盘的存取本就是一个块一个块来进行的，所以新的I/O处理方式对于底层底数据存取更自然更有效率。</p>
<p>断言和日志处理： J2SE 1.4版本在Java语言层面上加入了断言（assert关键字），在API层面上加入日志处理API，这些为程序的调试提供了强有力的支持 。</p>
<p>从上面的分析可以看出，Java 2平台在经过数年的发展后，已经比较成熟稳定，J2SE 1.4主要是对平台的性能进行较多的考虑和修改。在分布式程序方面，1.4版比1.3版的运行效率提高了一半以上；而在客户端程序方面，1.4版比1.3版的效率提高了1/3。当然,除了考虑运行效率，J2SE 1.4还有其它方面的改进，如推出了一个全新的运行Java应用程序的方法Java Web Start，该方法克服了Java Applet的安全性限制的问题和Java Application的软件发布难的问题，并结合了上面两种方法的好处，为Java软件客户提供了非常友好的使用体验。</p>
<p>J2SE 1.4版是J2SE 第一个参与了 Java共同体过程(JCP)的J2SE 版本。 象Borland、Compaq、Fujitsu、 SAS、 Symbian、 IBM这样的公司，和Sun一起定义并发展了J2SE  1.4规范。在开放、良好的文档编撰与管理的过程中，形成了一个高质量的、代表了Java共同体的多样性的规范。J2SE 1.4的Specification Lead是Doug Kramer。Doug Kramer是优秀的Java开发人员和著名的教育培训专家，他同时还是J2SE 1.4.2的Specification Lead 和J2SE 1.5的JVM的Specification Lead。</p>
<p><strong>改名换姓：意义深远的J2SE 5.0诞生史</strong></p>
<p>在2004年十月J2SE 5.0发布的时候，SUN公司这样解释这次版本名称不是J2SE 1.5而是J2SE 5.0的原因：“从Java诞生至今已有9年时间，而从有J2SE 算起也有5个年头了；在这样的背境下，将该版本号从1.5改为5.0可以更好的反映出新版的J2SE 的成熟度、稳定性、可伸缩性、安全性。”</p>
<p>J2SE 的这次变更之重大和意义之深远，的确也值得我们为之把版本号变换到J2SE 5.0。我们再看看Sun公司网站对J2SE 5.0的features描述：“通过增强Java平台的力量，允许开发者更容易地使用，Java编程语言的这些改进将吸引大量各种Java开发者”，这是“Java技术发展历程的一个重要里程碑” 。从这个描述我们可以看出，J2SE 5.0最大的目标是通过提供易用性而吸引各种开发者(当然包括以前的C/C++开发者) ，而它对以前版本的修改并不仅仅是API的升级，而且包括对Java语言层面的改进。</p>
<p>访问环境变量： 最初的Java语言有一个访问环境变量的方法System.getenv()，但因为Java宣称的”Write Once,Run AnyWhere”特性，所以在JDK1.0中去掉了这个能够访问平台专有信息的方法。在J2SE 5.0中，它又来了，并有所扩充。由此可见J2SE 5.0对编程方便性的重视程度。</p>
<p>泛型 J2SE 5.0提供了强大的泛型机制，让程序员可以减少代码重复，这个变化应该可以吸引小部分的C#开发人员吧。</p>
<p>增强的for循环 为了克服普通for循环的代码臃肿特点，J2SE 5.0提供了增强的for循环，我们现在可以这样写一个for循环：</p>
<pre>
<li><span><span>public</span><span> </span><span>void</span><span> printAll(Collection&lt; String&gt; coll)  </span></span></li>
<li><span>{  </span></li>
<li><span>for</span><span>(String str : coll)  </span></li>
<li><span>{  </span></li>
<li><span>System.out.println(str);  </span></li>
<li><span>}  </span></li>
<li><span>} </span></li>
</pre>
<p>怎么样？是不是简单了很多？</p>
<p>自动的装箱/拆箱 我们以前手工的做装箱(Boxing)/拆箱(unBoxing)操作时，是不是很烦?放心，J2SE 5.0提供了自动的装箱/拆箱操作，我们现在可以写如下的代码：</p>
<pre>
<li><span><span><strong><span style="color: #006699;">public</span></strong></span><span> </span><span><strong><span style="color: #006699;">void</span></strong></span><span> boxing(</span><span><strong><span style="color: #006699;">int</span></strong></span><span> i)  </span></span></li>
<li><span>{  </span></li>
<li><span>ArrayList&lt; Integer&gt; list=</span><span><strong><span style="color: #006699;">new</span></strong></span><span> ArrayList&lt; Integer&gt;();  </span></li>
<li><span>list.add(</span><span><span style="color: #c00000;">0</span></span><span>,i);  </span></li>
<li><span>System.out.println(“i的值是”+list.get(</span><span><span style="color: #c00000;">0</span></span><span>));  </span></li>
<li><span>} </span></li>
</pre>
<p>可变参数数目 J2SE 5.0 开始支持Varargs(不固定自变量个数)，J2SE 5.0中还加入了以前抛弃的枚举和C风格的格式化输出，这应该是为了吸引以前的C开发者吧。毕竟,在C开发中枚举和格式化输出用的是太多了。</p>
<p>并发 J2SE 5.0中加入了java.util.concurrent包，并向集合框架中加入了Queue接口，J2SE 5.0还为各种集合提供了并发情况下的实现。<br />
Properties类增强 由于XML的普及性应用，J2SE 5.0为java.util.Properties类加入了从XML文件中装载属性和把属性值存储到XML文件中的方法。</p>
<p>Annotation功能 J2SE 5.0提供了注解(annotation)/元数据（metadata）功能，相信以后的大部分应用产品都将充分利用它的注解而实现产品的各种特性。</p>
<p>其它 J2SE 5.0还在多线程（并发机制）、安全、国际化、UI等方面进行了大规模的变更，使得我们能够更方便地进行Java开发。</p>
<p>其实，上面的这些变更，并不是我们程序员非要不可的内容。我们完全可以通过自己的办法来达到这些变更实现的功能。但J2SE 5.0的目标就是让我们程序员能够更加方便地进行开发，所以，我们在基于J2SE 5.0开发时，应该能够明显的体会到它的易用性。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.hugstone.com/index.php/archives/426/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
