了解下JAVA的Java实际与理论: 渣滓搜集简史
先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。Java言语多是利用最普遍的依附于渣滓搜集的编程言语,可是它并非第一个。渣滓搜集已成了包含Lisp、Smalltalk、Eiffel、Haskell、ML、Scheme和Modula-3在内的很多编程言语的一个集成部分,而且从20世纪60年月初期就入手下手利用了。在Java实际与理论的本篇文章中,BrianGoetz形貌了渣滓搜集最经常使用的手艺。
渣滓搜集的优点是无可狡辩的DD牢靠性进步、使内存办理与类接口计划分别,并使开辟者削减了跟踪内存办理毛病的工夫。出名的悬空指针和内存泄露成绩在Java程序中不再会产生了(Java程序大概会呈现某种情势的内存泄漏,更准确地说长短存心的对象保存,可是这是一个分歧的成绩)。不外,渣滓搜集不是没有价值的DD个中包含对功能的影响、停息、设置庞大性和不断定的停止(nondeterministicfinalization)。
一个幻想的渣滓搜集完成应当是完整不成见的DD没有渣滓搜集停息、没有由于渣滓搜集而发生的CPU工夫丧失、渣滓搜集器不会与假造内存大概缓存有负面的互动,而且堆不必要年夜于使用程序的驻留空间(即堆占用)。固然,没有完美无缺的渣滓搜集器,可是渣滓搜集器在已往十年中已有了很年夜改善。
选项与选择
1.3JDK包含三种分歧的渣滓搜集战略,1.4.1JDK包含六种渣滓搜集战略和12种以上用于设置和优化渣滓搜集的命令行选项。它们有甚么分歧?为什么必要有这么多选项?
分歧的渣滓搜集完成利用分歧的战略来辨认和发出不成抵达的对象,它们与用户程序和调剂器以分歧的体例互动。分歧范例的使用程序关于渣滓搜集有分歧的请求DD及时使用程序会将请求搜集停息的延续工夫短而且无限制,而企业使用程序大概同意更长工夫和可展望性更低的停息以取得更高的吞吐才能。
渣滓搜集怎样事情?
有几种渣滓搜集的基础战略:援用计数、标志-扫除、标志-收拾(mark-compact)和复制。别的,一些算法能够以增量体例完成它们的事情(不必要一次搜集全部堆,使得搜集停息工夫更短),一些算法能够在用户程序运转时运行(并发搜集)。其他算法例必需在用户程序停息时一次举行全部搜集(即所谓的stop-the-world搜集器)。最初,另有夹杂型的搜集器,如1.2和今后版本的JDK利用的分代搜集器,它对堆的分歧地区利用分歧的搜集算法。
在对渣滓搜集算法举行评价时,我们大概要思索以下一切尺度:
停息工夫。搜集器是不是中断一切事情来举行渣滓搜集?要中断多长工夫?暂停是不是偶然间限定?
停息的可展望性。渣滓搜集停息是不是计划为在用户程序便利而不是渣滓搜集器便利的工夫产生?
CPU占用。总的可用CPU工夫用在渣滓搜集上的百分比是几?
内存巨细。很多渣滓搜集算法必要将堆支解成自力的内存空间,个中一些空间在某些时候对用户程序是不成会见的。这意味着堆的实践巨细大概比用户程序的最年夜堆驻留空间要年夜几倍。
假造内存交互。在具有无限物理内存的体系上,一个完全的渣滓搜集在渣滓搜集过程当中大概会毛病地将十分驻页面放到内存中来举行反省。由于页面毛病的本钱很高,以是渣滓搜集器准确办理援用的地区性(locality)是很需要的。
缓存交互。即便在全部堆能够放到主内存中的体系上DD实践上几近一切Java使用程序都能够做到这一点,渣滓搜集也经常会有将用户程序利用的数据冲出缓存的效果,从而影响用户程序的功能。
对程序地区性的影响。固然一些人以为渣滓搜集器的事情只是发出不成抵达的内存,可是其别人以为渣滓搜集器还应当只管改善用户程序的援用地区性。整理搜集器和复制搜集器在搜集过程当中从头布置对象,这有大概改善地区性。
编译器和运转时影响。一些渣滓搜集算法请求编译器大概运转时情况的主要共同,如当举行指针分派时更新援用计数。这增添了编译器的事情,由于它必需天生这些簿记指令,同时增添了运转时情况的开支,由于它必需实行这些分外的指令。这些请求对功能有甚么影响呢?它是不是会搅扰编译时优化呢?
不论选择甚么算法,硬件和软件的开展使渣滓搜集更具有有用性。20世纪70和80年月的履历研讨标明,关于年夜型Lisp程序,渣滓搜集损耗25%到40%的运转时。渣滓搜集还不克不及做到完整不成见,这一定另有很长的路要走。
基础算法
一切渣滓搜集算法所面对的成绩是不异的DD找出由分派器分派的,可是用户程序不成抵达的内存块。不成抵达是甚么意义?能够以两种体例之一会见内存块DD大概用户程序在根(root)中有对这一内存块的援用,大概在另外一个可抵达的块中有对这个块的援用。在Java程序中,根是对静态变量中大概活泼的仓库框架上的当地变量中所包括的对象的援用。可抵达的对象集是指向干系下根集的传送闭包。
<p>
前些天,在CSDN上看到了一个消息,说是net网页编程网页编程AJAX成功在Linux上运行,这一点对我触动很大,而且引发了我许多感叹,所以想写出来分享一下。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 是一种使网页(Web Page)产生生动活泼画面的语言 是一种使用者不需花费很多时间学习的语言 至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
页:
[1]