精华内容
下载资源
问答
  • 首先声明:这一系列是本人阅读周志明老师的《深入理解Java虚拟机》第二版后自己做的个人总结,在这里记录我认为的重点。一方面是回顾学习内容加深理解,另一方面,是方便自己以后重新阅读《深入理解Java虚拟机》。一...

    首先声明:这一系列是本人阅读周志明老师的《深入理解Java虚拟机》第二版(希望每个人都买一本来阅读,你不知道对你有什么帮助,但是请相信一定是有帮助的)后自己做的个人总结,在这里记录我认为的重点。一方面是回顾学习内容加深理解,另一方面,是方便自己以后重新阅读《深入理解Java虚拟机》。

    一:Java技术体系

    从传统意义上来讲,Sun公司所定义的Java技术体系包括:

    • Java程序设计语言
    • 各种硬件平台上的Java虚拟机
    • Class文件格式
    • Java API类库
    • 来至商业机构和开源社区的第三方Java类库

    我们可以把Java程序设计语言,Java虚拟机,Java API类库这三部分统称为JDK(JAVA Development Kit),JDK是支持Java程序开发的最小环境。另外,我们把Java Se API子集和Java虚拟机这两部分统称为JRE(Java Runtime Environment),JRE是支持程序运行的标准环境。

    如果按照业务领域来划分Java技术系统,可分为下面四种:

    • Java Card:支持一些小程序运行在小内存设备(如智能卡)上的平台。
    • Java Me(Micro Edition):支持Java运行在移动终端上的平台。
    • Java Se(Standard Edition):支持面向桌面级应用的Java平台。
    • Java EE(Enterprise Edition):支持使用多层架构的企业应用的Java平台。

    二:Java的发展历程

    1995年5月23日,Java语言诞生;
    1996年1月,第一个JDK-JDK1.0诞生;
    1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入Java技术;
    1996年9月,约8.3万个网页应用了Java技术来制作;
    1997年2月18日,JDK1.1发布;
    1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议纪录;
    1997年9月,JavaDeveloperConnection社区成员超过十万;
    1998年2月,JDK1.1被下载超过2,000,000次;
    1998年12月8日,Java 2企业平台J2EE发布 (J2EE1.2);
    1999年6月,SUN公司发布Java三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME);
    2000年5月8日,JDK1.3发布;
    2000年5月29日,JDK1.4发布;
    2001年6月5日,Nokia宣布到2003年将出售1亿部支持Java的手机;
    2001年9月24日,J2EE1.3发布;
    2002年2月26日,J2SE1.4发布,此后Java的计算能力有了大幅提升;同年微软发布.NET Framework;
    2004年9月30日,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0;
    2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”: J2ME更名为Java ME, J2SE更名为Java SE, J2EE更名为Java EE;
    2006年12月,SUN公司发布JRE6.0;
    2009年12月,SUN公司发布Java EE 6;
    2010年11月,由于甲骨文对Java社区的不友善,因此Apache扬言将退出JCP;
    2011年7月,甲骨文发布Java SE 7;
    2014年3月,甲骨文发表Java SE 8;
    Java SE 9 Oracle宣布 2016年9月发布;
    2017年9月21延期了好几次的Java9正式发布;
    2018年3月20号发布了Java10;

    2018年9月,预计发布Oracle长期支持版本Java11。。。。。。;

    但是据统计,现在有82%的用户使用的还是Java8或者以下版本进行开发,感觉已经跟不上新版本发布的脚步了。

    三:JVM的发展

    1.Sun Classic / Exact VM
    以今天的视角来看,Sun Classic VM的技术可能很原始,这款虚拟机的使命也早已终结。但仅凭它“世界上第一款商用Java虚拟机”的头衔,就足够有让历史记住它的理由。
    1996年1月23日,Sun公司发布JDK 1.0,Java语言首次拥有了商用的正式运行环境,这个JDK中所带的虚拟机就是Classic VM。这款虚拟机只能使用纯解释器方式来执行Java代码,如果要使用JIT编译器,就必须进行外挂。但是假如外挂了JIT编译器,JIT编译器就完全接管了虚拟机的执行系统,解释器便不再工作了。用户在这款虚拟机上执行java -version命令,将会看到类似下面这行输出:

    其中的“sunwjit”就是Sun提供的外挂编译器,其他类似的外挂编译器还有Symantec JIT和shuJIT等。由于解释器和编译器不能配合工作,这就意味着如果要使用编译器执行,编译器就不得不对每一个方法、每一行代码都进行编译,而无论它们执行的频率是否具有编译的价值。基于程序响应时间的压力,这些编译器根本不敢应用编译耗时稍高的优化技术,因此这个阶段的虚拟机即使用了JIT编译器输出本地代码,执行效率也和传统的C/C++程序有很大差距,“Java语言很慢”的形象就是在这时候开始在用户心中树立起来的。

    Sun的虚拟机团队努力去解决Classic VM所面临的各种问题,提升运行效率。在JDK 1.2时,曾在Solaris平台上发布过一款名为Exact VM的虚拟机,它的执行系统已经具备现代高性能虚拟机的雏形:如两级即时编译器、编译器与解释器混合工作模式等。Exact VM因它使用准确式内存管理(Exact Memory Management,也可以叫Non-Conservative/Accurate Memory Management)而得名,即虚拟机可以知道内存中某个位置的数据具体是什么类型。虽然Exact VM的技术相对Classic VM来说先进了许多,但是在商业应用上只存在了很短暂的时间就被更为优秀的HotSpot VM所取代,甚至还没有来得及发布Windows和Linux平台下的商用版本。而Classic VM的生命周期则相对长了许多,它在JDK 1.2之前是Sun JDK中唯一的虚拟机,在JDK 1.2时,它与HotSpot VM并存,但默认使用的是Classic VM(用户可用java-hotspot参数切换至HotSpot VM),而在JDK 1.3时,HotSpot VM成为默认虚拟机,但Classic VM仍作为虚拟机的“备用选择”发布(使用java-classic参数切换),直到JDK 1.4的时候,Classic VM才完全退出商用虚拟机的历史舞台,与Exact VM一起进入了Sun Labs Research VM之中。

    2.Sun HotSpot VM
    提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的;甚至这个虚拟机最初并非是为Java语言而开发的,它来源于Strongtalk VM,而这款虚拟机中相当多的技术又是来源于一款支持Self语言实现“达到C语言50%以上的执行效率”的目标而设计的虚拟机,Sun公司注意到了这款虚拟机在JIT编译上有许多优秀的理念和实际效果,在1997年收购了Longview Technologies公司,从而获得了HotSpot VM。
    HotSpot VM既继承了Sun之前两款商用虚拟机的优点,也有许多自己新的技术优势,如它名称中的HotSpot指的就是它的热点代码探测技术,HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。如果一个方法被频繁调用,或方法中有效循环次数很多,将会分别触发标准编译和OSR(栈上替换)编译动作。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减小,这样有助于引入更多的代码优化技术,输出质量更高的本地代码。
    在2006年的JavaOne大会上,Sun公司宣布最终会把Java开源,并在随后的一年,陆续将JDK的各个部分(其中当然也包括了HotSpot VM)在GPL协议下公开了源码,并在此基础上建立了OpenJDK。这样,HotSpot VM便成为了Sun JDK和OpenJDK两个实现极度接近的JDK项目的共同虚拟机。

    在2008年和2009年,Oracle公司分别收购了BEA公司和Sun公司,这样Oracle就同时拥有了两款优秀的Java虚拟机:JRockit VM和HotSpot VM。Oracle公司宣布在不久的将来(大约应在发布JDK 8的时候)会完成这两款虚拟机的整合工作,使之优势互补。整合的方式大致上是在HotSpot的基础上,移植JRockit的优秀特性,譬如使用JRockit的垃圾回收器与MissionControl服务,使用HotSpot的JIT编译器与混合的运行时系统。

    3. Sun Mobile-Embedded VM / Meta-Circular VM
    Sun公司所研发的虚拟机可不仅有前面介绍的服务器、桌面领域的商用虚拟机,除此之外,Sun公司面对移动和嵌入式市场,也发布过虚拟机产品,另外还有一类虚拟机,在设计之初就没抱有商用的目的,仅仅是用于研究、验证某种技术和观点,又或者是作为一些规范的标准实现。这些虚拟机对于大部分不从事相关领域开发的Java程序员来说可能比较陌生。Sun公司发布的其他Java虚拟机有:
    (1)KVM
    KVM中的K是“Kilobyte”的意思,它强调简单、轻量、高度可移植,但是运行速度比较慢。在Android、iOS等智能手机操作系统出现前曾经在手机平台上得到非常广泛的应用。
    (2)CDC/CLDC HotSpot Implementation
    CDC/CLDC全称是Connected(Limited)Device Configuration,在JSR-139/JSR-218规范中进行定义,它希望在手机、电子书、PDA等设备上建立统一的Java编程接口,而CDC-HI VM和CLDC-HI VM则是它们的一组参考实现。CDC/CLDC是整个Java ME的重要支柱,但从目前Android和iOS二分天下的移动数字设备市场看来,在这个领域中,Sun的虚拟机所面临的局面远不如服务器和桌面领域乐观。
    (3)Squawk VM
    Squawk VM由Sun公司开发,运行于Sun SPOT(Sun Small Programmable Object Technology,一种手持的WiFi设备),也曾经运用于Java Card。这是一个Java代码比重很高的嵌入式虚拟机实现,其中诸如类加载器、字节码验证器、垃圾收集器、解释器、编译器和线程调度都是Java语言本身完成的,仅仅靠C语言来编写设备I/O和必要的本地代码。
    (4)JavaInJava
    JavaInJava是Sun公司于1997年~1998年间研发的一个实验室性质的虚拟机,从名字就可以看出,它试图以Java语言来实现Java语言本身的运行环境,既所谓的“元循环”(Meta-Circular,是指使用语言自身来实现其运行环境)。它必须运行在另外一个宿主虚拟机之上,内部没有JIT编译器,代码只能以解释模式执行。在20世纪末主流Java虚拟机都未能很好解决性能问题的时代,开发这种项目,其执行速度可想而知。
    (5)Maxine VM
    Maxine VM和上面的JavaInJava非常相似,它也是一个几乎全部以Java代码实现(只有用于启动JVM的加载器使用C语言编写)的元循环Java虚拟机。这个项目于2005年开始,到现在仍然在发展之中,比起JavaInJava,Maxine VM就显得“靠谱”很多,它有先进的JIT编译器和垃圾收集器(但没有解释器),可在宿主模式或独立模式下执行,其执行效率已经接近了HotSpot Client VM的水平。
    4. BEA JRockit / IBM J9 VM
    Oracle JRockit (原来的 Bea JRockit)系列产品是一个全面的[Java](https://baike.baidu.com/item/Java/85979)运行时解决方案组合,包括了行业最快的标准Java解决方案。 大量的行业[基准测试](https://baike.baidu.com/item/%E5%9F%BA%E5%87%86%E6%B5%8B%E8%AF%95/5876292)显示,基本JRockit JVM是世界上最快的[JVM](https://baike.baidu.com/item/JVM/2902369)。JRockit面向延迟敏感型应用的解决方案JRockit Real Time提供以毫秒或微秒级的JVM响应时间,适合财务前端办公、军事指挥与控制和电信网络的需要。使用JRockit产品,客户已经体验到了显著的性能提高(一些超过了70% )和硬件成本的减少(达50%)。
    JRockit VM曾经号称“世界上速度最快的Java虚拟机”它是BEA公司在2002年从Appeal Virtual Machines公司收购的虚拟机。BEA公司将其发展为一款专门为服务器硬件和服务器端应用场景高度优化的虚拟机,由于专注于服务器端应用,它可以不太关注程序启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行。除此之外,JRockit的垃圾收集器和MissionControl服务套件等部分的实现,在众多Java虚拟机中也一直处于领先水平。
    IBM J9 VM并不是IBM公司唯一的Java虚拟机,不过是目前其主力发展的Java虚拟机。IBM J9 VM原本是内部开发代号,正式名称是“IBM Technology for Java Virtual Machine”,简称IT4J,只是这个名字太拗口了一点,普及程度不如J9。J9 VM最初是由IBM Ottawa实验室一个名为SmallTalk的虚拟机扩展而来的,当时这个虚拟机有一个bug是由8k值定义错误引起的,工程师花了很长时间终于发现并解决了这个错误,此后这个版本的虚拟机就称为K8了,后来扩展出支持Java的虚拟机就被称为J9了。与BEA JRockit专注于服务器端应用不同,IBM J9的市场定位与Sun HotSpot比较接近,它是一款设计上从服务器端到桌面应用再到嵌入式都全面考虑的多用途虚拟机,J9的开发目的是作为IBM公司各种Java产品的执行平台,它的主要市场是和IBM产品(如IBM WebSphere等)搭配以及在IBM AIX和z/OS这些平台上部署Java应用。
    5. Azul VM / BEA Liquid VM
    我们平时所提及的“高性能Java虚拟机”一般是指HotSpot、JRockit、J9这类在通用平台上运行的商用虚拟机,但其实Azul VM和BEA Liquid VM这类特定硬件平台专有的虚拟机才是“高性能”的武器。
    Azul VM是Azul Systems 公司在HotSpot基础上进行大量改进,运行于Azul Systems公司的专有硬件Vega系统上的Java虚拟机,每个Azul VM实例都可以管理至少数十个CPU和数百GB内存的硬件资源,并提供在巨大内存范围内实现可控的GC时间的垃圾收集器、为专有硬件优化的线程调度等优秀特性。在2010年,Azul Systems公司开始从硬件转向软件,发布了自己的Zing JVM,可以在通用x86平台上提供接近于Vega系统的特性。
    Liquid VM即是现在的JRockit VE(Virtual Edition),它是BEA公司开发的,可以直接运行在自家Hypervisor系统上的JRockit VM的虚拟化版本,Liquid VM不需要操作系统的支持,或者说它自己本身实现了一个专用操作系统的必要功能,如文件系统、网络支持等。由虚拟机越过通用操作系统直接控制硬件可以获得很多好处,如在线程调度时,不需要再进行内核态/用户态的切换等,这样可以最大限度地发挥硬件的能力,提升Java程序的执行性能。
    6. Apache Harmony / Google Android Dalvik VM
    Harmony VM和Dalvik VM只能称做“虚拟机”,而不能称做“Java虚拟机”,但是这两款虚拟机(以及所代表的技术体系)对最近几年的Java世界产生了非常大的影响和挑战,甚至有些悲观的评论家认为成熟的Java生态系统有崩溃的可能。
    Apache Harmony是一个Apache软件基金会旗下以Apache License协议开源的实际兼容于JDK 1.5和JDK 1.6的Java程序运行平台,这个介绍相当拗口。它包含自己的虚拟机和Java库,用户可以在上面运行Eclipse、Tomcat、Maven等常见的Java程序,但是它没有通过TCK认证,所以我们不得不用那么一长串拗口的语言来介绍它,而不能用一句“Apache的JDK”来说明。如果一个公司要宣布自己的运行平台“兼容于Java语言”,那就必须要通过TCK(Technology Compatibility Kit)的兼容性测试。Apache基金会曾要求Sun公司提供TCK的使用授权,但是一直遭到拒绝,直到Oracle公司收购了Sun公司之后,双方关系越闹越僵,最终导致Apache愤然退出JCP(Java Community Process)组织,这是目前为止Java社区最严重的一次“分裂”。
    在Sun将JDK开源形成OpenJDK之后,Apache Harmony开源的优势被极大地削弱,甚至连Harmony项目的最大参与者IBM公司也宣布辞去Harmony项目管理主席的职位,并参与OpenJDK项目的开发。虽然Harmony没有经过真正大规模的商业运用,但是它的许多代码(基本上是Java库部分的代码)被吸纳进IBM的JDK 7实现及Google Android SDK之中,尤其是对Android的发展起到了很大的推动作用。
    说到Android,这个时下最热门的移动数码设备平台在最近几年间的发展过程中所取得的成果已经远远超越了Java ME在过去十多年所获得的成果,Android让Java语言真正走进了移动数码设备领域,只是走的并非Sun公司原本想象的那一条路。
    Dalvik VM是Android平台的核心组成部分之一,它的名字来源于冰岛一个名为Dalvik的小渔村。Dalvik VM并不是一个Java虚拟机,它没有遵循Java虚拟机规范,不能直接执行Java的Class文件,使用的是寄存器架构而不是JVM中常见的栈架构。但是它与Java又有着千丝万缕的联系,它执行的dex(Dalvik Executable)文件可以通过Class文件转化而来,使用Java语法编写应用程序,可以直接使用大部分的Java API等。目前Dalvik VM随着Android一起处于迅猛发展阶段,在Android 2.2中已提供即时编译器实现,在执行性能上有了很大的提高。
    7. Microsoft JVM及其他
    在十几年的Java虚拟机发展过程中,除去上面介绍的那些被大规模商业应用过的Java虚拟机外,还有许多虚拟机是不为人知的或者曾经“绚丽”过但最终湮灭的。我们以其中微软公司的JVM为例来介绍一下。
    也许Java程序员听起来可能会觉得惊讶,微软公司曾经是Java技术的铁杆支持者(也必须承认,与Sun公司争夺Java的控制权,令Java从跨平台技术变为绑定在Windows上的技术是微软公司的主要目的)。在Java语言诞生的初期(1996年~1998年,以JDK 1.2发布为分界),它的主要应用之一是在浏览器中运行Java Applets程序,微软公司为了在IE3中支持Java Applets应用而开发了自己的Java虚拟机,虽然这款虚拟机只有Windows平台的版本,却是当时Windows下性能最好的Java虚拟机,它在1997年和1998年连续两年获得了《PC Magazine》杂志的“编辑选择奖”。但好景不长,在1997年10月,Sun公司正式以侵犯商标、不正当竞争等罪名控告微软公司,在随后对微软公司的垄断调查之中,这款虚拟机也曾作为证据之一被呈送法庭。这场官司的结果是微软公司赔偿2000万美金给Sun公司(最终微软公司因垄断赔偿给Sun公司的总金额高达10亿美元),承诺终止其Java虚拟机的发展,并逐步在产品中移除Java虚拟机相关功能。具有讽刺意味的是,到最后在Windows XP SP3中Java虚拟机被完全抹去的时候,Sun公司却又到处登报希望微软公司不要这样做。Windows XP高级产品经理Jim Cullinan称:“我们花费了3年的时间和Sun打官司,当时他们试图阻止我们在Windows中支持Java,现在我们这样做了,可他们又在抱怨,这太具有讽刺意味了。”

    我们试想一下,如果当年Sun公司没有起诉微软公司,微软公司继续保持着对Java技术的热情,那Java的世界会变得怎么样呢?.NET技术是否会发展起来?但历史是没有假设的。

    四:Java技术展望

    我们可以看到的是,文章说的技术一步一步的走进了现实

    比如模块化已经在Java9当中实现,多核编程技术随着Java8当中的lambda表达式的出现和lambda表达式在Java9当中的进一步优化而得到极大的改善,慢慢往Java函数式编程方向发展。更丰富的语法,64位的虚拟机已经成为了现实。

    长久以来,Java语言一直备受挑战,随着python,go语言的蓬勃发展,Java压力不小,甚至来自同样运行在Java虚拟机上的其他语言的挑战,比如Groovy、Scala、JRuby和Jython等。JavaScript语言也借助于node.js和Aptana Jaxer等平台在服务器端开发中占据了一席之地。但是Java语言就是处于一直被唱衰,就保持第一的状态,短时间内看,Java还是会保持巨大的生命力和统治力。从TIOBE 编程语言排行榜每月发布的排行榜上来看,Java也是常年处于第一的位置。

    在网上我们经常看到各路程序员为哪种语言好掐的头破血流的,形成了开发语言鄙视链。

    写组合语言的工程师鄙视写 C 语言的工程师,C 语言工程师鄙视 C++ 工程师,C++ 工程师鄙视 Java 和 C# 工程师,Java 工程师和 C# 工程师则互相鄙视,而 C# 工程师又鄙视 Visual Basic 工程师和会把 C# 念成「C 井」的工程师,会把 C# 念成「C 井」的工程师则鄙视认为 HTML 是一种程序语言的设计师。
    用 Python 3 的工程师鄙视还在用 Python 2 的工程师,用 Python 2 的工程师鄙视遇到 UnicodeEncodeError 的工程师。
    写 iOS 的工程师鄙视写 Android 的工程师,写 Android 的工程师鄙视写 Windows Phone 的工程师。
    有 Swift 一年经验的工程师鄙视有 Objective-C 五年经验的工程师,写 Objective-C 的工程师鄙视用 PhoneGap 包装成 native app 的工程师。

    用 React.js 的工程师鄙视用 AngularJS 的工程师,用 AngularJS 的工程师鄙视用 jQuery 的工程师,用 jQuery 的工程师鄙视用 Vanilla JavaScript 的工程师,用 Vanilla JavaScript 的工程师鄙视 IE 的使用者。

    其实我想说的是没有牛逼的编程语言,只有牛逼的玩家。语言只是工具,人才是灵魂,编程的目的是为了解决实际问题的,能否利用该语言去解决实际产生的问题才是关键。每个人选定了方向之后一直去努力,一步一步的往上走,修炼到深处都是大牛。能够让你跟别人产生差距的的永远不可能是语言,能够让你跟别人产生差距的永远是你本身,共勉。


    展开全文
  • Java事物的理解

    千次阅读 2016-01-24 23:00:40
    一、什么是Java事物  我们通常说的事物是指数据库事物,那么Java事物又是什么,它与数据库事物之间是什么关系? 在Java的开发系统中,如果需要操作数据库,则需要JDBC来连接。新增,修改,删除数据也是通过java...

    一、什么是Java事物

            我们通常说的事物是指数据库事物,那么Java事物又是什么,它与数据库事物之间是什么关系?

    Java的开发系统中,如果需要操作数据库,则需要JDBC来连接。新增,修改,删除数据也是通过java代码来操作,所以数据库事物的控制就转移到Java代码中,这时候的数据库事物习惯上就叫做Java事物。

    二、Java的事物类型

       Java的事物类型有两种:JDBC事物和JTAJava Transaction API)事物

    1.JDBC事物

    JDBC 事务(本地事物)是用 Connection 对象控制的,下图是一个简单的本地事物处理流程:

    JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交

    java.sql.Connection 提供了以下控制事务的方法:

    public voidsetAutoCommit(boolean)

    public booleangetAutoCommit()

    public void commit()

    public void rollback()

    使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

    2. JTA事物(Java Transaction API

    JTA(分布式事物)是一种高层的,与实现无关的,与协议无关的API。应用程序可以通过JTA的接口使用事物。JDBC事物相比,JTA事物允许访问或者更新多个资源(通常是数据库),极大的提高了数据的访问能力。下图是一个简单的分布式事物的处理流程:

    1.UserTransaction—javax.transaction.UserTransaction接口提供能够编程地控制事务处理范围的应用程序。 javax.transaction.UserTransaction方法开启一个全局事务并且使用调用线程与事务处理关联。

    2.Transaction Manager—javax.transaction.TransactionManager接口允许应用程序服务器来控制代表正在管理的应用程序的事务范围。

    3XAResource—javax.transaction.xa.XAResource接口是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。

    注意:

    如果一个程序已经用了分布式事物的XA连接就不要再用JDBC连接,即不要使用java.sql.Connection. commit()java.sql.Connection. rollback()

    三、容器事物

            容器事物一般是指J2EE容器自己的提供的事物管理机制,这里笔者理解容器事物应该是指框架事物,例如EJBHibernate等框架提供的事物服务。其原理是对JDBCJTA的再次封装,在使用上提供了更加方便的API或者是更强大的声明式的事物管理。

    四、JDBC事务隔离级别 

             在多线程访问数据源的情况下,事物之间使用锁隔开的。JDBCAPI提供了5中不同级别的隔离级别,具体如下:

    TRANSACTION_NONE不支持事务。

    TRANSACTION_READ_UNCOMMITTED 在提交前一个事务可以看到另一个事务的变化。这样脏读、不可重复的读和虚读都是允许的。 

    TRANSACTION_READ_COMMITTED 读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。 

    TRANSACTION_REPEATABLE_READ 事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。 

    TRANSACTION_SERIALIZABLE是最高的事务级别,它防止脏读、不可重复的读和虚读。 

    在程序开发时可以通过Connection对象使用上面的几种隔离级别,事物的级别越高,性能损耗就越大。

     

    展开全文
  • 今天,收到业内同行的消息:邓老师出新书啦——《深入理解Android:Java虚拟机ART》,主要内容包括:ART虚拟机源码分析、oat文件结构、GC、JVM执行原理、多线程管理、dex、JIT等虚拟机核心技术。全书近1000页,内容...

    自定义View系列教程00–推翻自己和过往,重学自定义View
    自定义View系列教程01–常用工具介绍
    自定义View系列教程02–onMeasure源码详尽分析
    自定义View系列教程03–onLayout源码详尽分析
    自定义View系列教程04–Draw源码分析及其实践
    自定义View系列教程05–示例分析
    自定义View系列教程06–详解View的Touch事件处理
    自定义View系列教程07–详解ViewGroup分发Touch事件
    自定义View系列教程08–滑动冲突的产生及其处理


    探索Android软键盘的疑难杂症
    深入探讨Android异步精髓Handler
    详解Android主流框架不可或缺的基石
    站在源码的肩膀上全解Scroller工作机制


    Android多分辨率适配框架(1)— 核心基础
    Android多分辨率适配框架(2)— 原理剖析
    Android多分辨率适配框架(3)— 使用指南


    Android程序员C语言自学完备手册
    讲给Android程序员看的前端系列教程(图文版)
    讲给Android程序员看的前端系列教程(视频版)


    版权声明


    几年前做Android开发,有次遇到一个与binder相关的底层问题,查阅了很多资料也没有解决。整整一周的时间,我从CSDN到github,从stackoverflow到EOE看了上百篇文章,尝试了十几个解决方案。但是,结果令人沮丧:这些文章流于表面没有深入的研究与剖析;不少方案内容失实没有严格的验证和深究,甚至断章取义,人云亦云;知识结构亦零零散散不成体系,质量堪忧。几天时间过去了依然是一筹莫展,毫无进展。郁闷至极只好安慰自己:还是换一种实现方式吧。话虽如此,心却不甘!网上的资料搞不定,就去实体书店看看。周末泡在新华文轩,把那几排移动开发相关的书都翻了个遍,最终在邓凡平写的《深入理解Android》里找到了答案,顿觉醍醐灌顶,茅塞顿开!当时不由得感慨:良心佳作啊,从应用层出发再到框架原理直至底层实现都有详细地深入讲解,作者的技术功底可谓扎实全面,非同一般。看书的同时,也顺道了解了书籍的作者:本科毕业于华中科技大学,后在中科院攻读硕士学位研究方向为超导磁体,毕业后进入软件开发行业…

    今天,收到业内同行的消息:邓老师出新书啦——《深入理解Android:Java虚拟机ART》,主要内容包括:ART虚拟机源码分析、oat文件结构、GC、JVM执行原理、多线程管理、dex、JIT等虚拟机核心技术。全书近1000页,内容详实,干货满满。不管是做Android底层还是应用层的程序猿们,我都推荐你们抽空读读此书;多一些技术积累,以助来日进取。

    在此,附上《深入理解Android:Java虚拟机ART》的地址,以供大家进一步了解和阅读。

    展开全文
  • 从你接触Java开发到现在,你对Java最直观的印象...今天我要问你的问题是,谈谈你对Java平台的理解?“Java是解释执行”,这句话正确吗?典型回答Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的...

    从你接触Java开发到现在,你对Java最直观的印象是什么呢?是它宣传的 “Compile once, run anywhere”,还是目前看已经有些过于形式主义的语法呢?你对于Java平台到底了解到什么程度?请你先停下来总结思考一下。

    今天我要问你的问题是,谈谈你对Java平台的理解?“Java是解释执行”,这句话正确吗?

    典型回答

    Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“一次编译,到处执行”(Compile once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。

    我们日常会接触到JRE(Java Runtime Environment)或者JDK(Java Development Kit)。 JRE,也就是Java运行环境,包含了JVM和Java类库,以及一些模块等。而JDK可以看作是JRE的一个超集,提供了更多工具,比如编译器、各种诊断工具等。

    对于“Java是解释执行”这句话,这个说法不太准确。我们开发的Java的源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过 Java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hospot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。


    考点分析

    其实这个问题,问得有点笼统。题目本身是非常开放的,往往考察的是多个方面,比如,基础知识理解是否很清楚;是否掌握Java平台主要模块和运行原理等。很多面试者会在这种问题上吃亏,稍微紧张了一下,不知道从何说起,就给出个很简略的回答。

    对于这类笼统的问题,你需要尽量表现出自己的思维深入并系统化,Java知识理解得也比较全面,一定要避免让面试官觉得你是个“知其然不知其所以然”的人。毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等很多事情的基础,相信没有招聘方会不喜欢“热爱学习和思考”的面试者。

    即使感觉自己的回答不是非常完善,也不用担心。我个人觉得这种笼统的问题,有时候回答得稍微片面也很正常,大多数有经验的面试官,不会因为一道题就对面试者轻易地下结论。通常会尽量引导面试者,把他的真实水平展现出来,这种问题就是做个开场热身,面试官经常会根据你的回答扩展相关问题。

    知识扩展

    回归正题,对于Java平台的理解,可以从很多方面简明扼要地谈一下,例如:Java语言特性,包括泛型、Lambda等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。

    或者谈谈JVM的一些基础概念和机制,比如Java的类加载机制,常用版本JDK(如JDK 8)内嵌的Class-Loader,例如Bootstrap、 Application和Extension Class-loader;类加载大致过程:加载、验证、链接、初始化(这里参考了周志明的《深入理解Java虚拟机》,非常棒的JVM上手书籍);自定义Class-Loader等。还有垃圾收集的基本原理,最常见的垃圾收集器,如SerialGC、Parallel GC、 CMS、 G1等,对于适用于什么样的工作负载最好也心里有数。这些都是可以扩展开的领域,我会在后面的专栏对此进行更系统的介绍。

    当然还有JDK包含哪些工具或者Java领域内其他工具等,如编译器、运行时环境、安全工具、诊断和监控工具等。这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上,同样有所帮助,很多都是触类旁通的。

    下图是我总结的一个相对宽泛的蓝图供你参考。

    不再扩展了,回到前面问到的解释执行和编译执行的问题。有些面试官喜欢在特定问题上“刨根问底儿”,因为这是进一步了解面试者对知识掌握程度的有效方法,我稍微深入探讨一下。

    众所周知,我们通常把Java分为编译期和运行时。这里说的Java的编译和C/C++是有着不同的意义的,Javac的编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以直接执行的机器码。Java通过字节码和Java虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系统和硬件的细节,这也是实现“一次编译,到处执行”的基础。

    在运行时,JVM会通过类加载器(Class-Loader)加载字节码,解释或者编译执行。就像我前面提到的,主流Java版本中,如JDK 8实际是解释和编译混合的一种模式,即所谓的混合模式(-Xmixed)。通常运行在server模式的JVM,会进行上万次调用以收集足够的信息进行高效的编译,client模式这个门限是1500次。Oracle Hotspot JVM内置了两个不同的JIT compiler,C1对应前面说的client模式,适用于对于启动速度敏感的应用,比如普通Java桌面应用;C2对应server模式,它的优化是为长时间运行的服务器端应用设计的。默认是采用所谓的分层编译(TieredCompilation)。这里不再展开更多JIT的细节,没必要一下子就钻进去,我会在后面介绍分层编译的内容。

    Java虚拟机启动时,可以指定不同的参数对运行模式进行选择。 比如,指定“-Xint”,就是告诉JVM只进行解释执行,不对代码进行编译,这种模式抛弃了JIT可能带来的性能优势。毕竟解释器(interpreter)是逐条读入,逐条解释运行的。与其相对应的,还有一个“-Xcomp”参数,这是告诉JVM关闭解释器,不要进行解释执行,或者叫作最大优化级别。那你可能会问这种模式是不是最高效啊?简单说,还真未必。“-Xcomp”会导致JVM启动变慢非常多,同时有些JIT编译器优化方式,比如分支预测,如果不进行profiling,往往并不能进行有效优化。

    除了我们日常最常见的Java使用模式,其实还有一种新的编译方式,即所谓的AOT(Ahead-of-Time Compilation),直接将字节码编译成机器代码,这样就避免了JIT预热等各方面的开销,比如Oracle JDK 9就引入了实验性的AOT特性,并且增加了新的jaotc工具。利用下面的命令把某个类或者某个模块编译成为AOT库。

    jaotc --output libHelloWorld.so HelloWorld.class
    jaotc --output libjava.base.so --module java.base

    然后,在启动时直接指定就可以了。

    java -XX:AOTLibrary=./libHelloWorld.so,./libjava.base.so HelloWorld

    而且,Oracle JDK支持分层编译和AOT协作使用,这两者并不是二选一的关系。如果你有兴趣,可以参考相关文档:http://openjdk.java.net/jeps/295。AOT也不仅仅是只有这一种方式,业界早就有第三方工具(如GCJ、Excelsior JET)提供相关功能。

    另外,JVM作为一个强大的平台,不仅仅只有Java语言可以运行在JVM上,本质上合规的字节码都可以运行,Java语言自身也为此提供了便利,我们可以看到类似Clojure、Scala、Groovy、JRuby、Jython等大量JVM语言,活跃在不同的场景。

    今天,我简单介绍了一下Java平台相关的一些内容,目的是提纲挈领地构建一个整体的印象,包括Java语言特性、 核心类库与常用第三方类库、Java虚拟机基本原理和相关工具,希望对你有所帮助。

    展开全文
  • 深入理解Android Java虚拟机ART相关及勘误

    千次阅读 热门讨论 2019-04-15 09:28:36
    《深入理解Android Java虚拟机ART》是一本以Android 7.0 ART JAVA虚拟机为目标的源码分析书籍。全书花费了将近3年时间, word原稿有1300多页,最终出版的书籍有900多页。定价看起来不便宜,16...
  • 文章目录1:Java虚拟机的介绍2:JVM的存在位置3:JVM整体结构4:Java代码执行流程5:JVM指令集的架构模型6:JVM的生命周期7:常见的Java虚拟机7.1 Sun Classic VM7.2 Exact VM7.3 HotSpot VM 1:Java虚拟机的介绍 ...
  • 从 Spring 到 Spring boot 、Spring Cloud 再到 Spring 全家桶,Spring 框架已成为 Java 开发行业的标准。笔者 多年 Java 面试经验,Spring 和 Spring boot 面试题偏向面试重点,现在面试时,会尽量把 Spring 全家桶...
  • Java行业的圣经 四本最重要的个人藏书,他们的书名都不含Java作者 Thomas E. Davis译者 msklsf@263.net摘要Thomas Davis 推荐了四本书,它们可以让你在java开发中受益非浅。这些书扩展了Java的基本语法和语义,使你能...
  • Java大佬在地表最强Java企业(阿里)面试总结

    万次阅读 多人点赞 2020-08-23 19:48:06
    下面以产品经理为例子回答: 互联网行业是一个高速发展的行业,同时也有大量创新和尝试的机会(阐述自己看好行业)。 而产品经理则是互联网企业的核心岗位之一,产品经理负责用户需求分析、竞品分析、产品设计和...
  • 牛逼!Java 从入门到精通,超全汇总版

    万次阅读 多人点赞 2021-05-06 19:40:33
    Java 设计模式Java 进阶Java 并发编程实战Java 并发编程艺术Java 并发编程之美图解Java多线程设计模式JVM深入理解 Java 虚拟机Java 虚拟机规范HotSpot 实战自己动手写 Java 虚拟机MySQLMySQL 基础教程SQL 基础教程...
  • Java行业的圣经-四本最重要的个人藏书 作者 Thomas E. Davis 译者 msklsf@263.net Java行业的圣经 四本最重要的个人藏书,他们的书名都不含Java 摘要 Thomas Davis 推荐了四本书,它们可以让你在java开发中受益非浅。...
  • Java 传统行业转向互联网开发

    千次阅读 2013-03-25 17:09:14
    工作两年来,一值从事 mis方面的开发,基本上做出来的系统不会考虑太多的细节问题,比如说 数据优化,缓存等等一些 并发访问量很大的时候需要考虑的问题。... 1.Java Core,就是Java基础、jdk的类库,很多童鞋都
  • Java 的接口理解【详细解释】

    千次阅读 2017-12-13 17:00:10
    Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 接口定义的...
  • 转行从事java行业以来的感受(1)

    万次阅读 多人点赞 2017-07-12 13:55:46
    2016年的4月27号,孤身一人带着前一份工作攒的钱来到了上海,开始了java培训。这里不点出哪个培训机构,回想起来,不觉得好,也不觉得不好。 一开始觉得自己本科毕业,以前学习能力很强,但是,学习真的很有压力,...
  • 愤怒!竟然还有学校还在教 Java 的 Swing

    万次阅读 多人点赞 2021-05-24 08:34:36
    昨天,有个读者私信我说,“老师正在教 Swing,这个...但我内心其实是非常愤怒的,都什么时候了,Java 中的 Swing 早被淘汰了,哪个项目还会用这玩意编写客户端界面呢! 学 Swing、AWT 这些图形化组件纯属浪费时间! 可
  • Java8编程实战

    万人学习 2016-12-31 18:03:03
    Java一直作为优秀的编程语言活跃于软件开发行业,掌握Java不仅是一件兴奋的事,更是一把可以帮助你轻松进入软件行业大门的一把金钥匙,本套课程将为读者讲解Java8的所有核心技术知识,一共240集的Java8开发课程,...
  • 软件行业有一点好,就是总是有很多东西要学。我对学新东西向来是很有兴趣的。但对实际学习的目标也会有一个选择。我有一句话,叫“ 宁愿闲着,也不要乱学 ” 。为什么?因为你的精力(请把它看做是一种资源)是有限...
  • 要想在软件行业增强发展力,必须着重基础与理论知识。  3.分维度培养:从业务理解、经验积累、规范性、质量控制、团队意识和软件生命周期六个方面进行训练。  4.分层次深入:主要分为初次使用、理解加深和灵活...
  • Java行业命名规则习惯

    万次阅读 2012-09-17 22:20:07
    但是由于Java面向对象编程的特性,每一名Java程序员都可以编写属于自己的Java包,为了保障每个 Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域...
  • Java就业指导

    万次阅读 多人点赞 2015-04-14 00:15:25
    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内容写...
  • 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC) 前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测....
  • 后来,又有读者私信问我,“挺纠结的,不知道该选前端还是 Java?” 真不好选,因为“男怕入错行,女怕嫁错郎”,初学者纠结这个问题也是情有可原。 首先来说说 PHP,Web 蛮荒的年代,PHP 真的是王者姿态,连 Java ...
  • 第一次看这篇文章时,是在CSDN...三月份学习的Java集合框架这部分,这几天拿出来整理就想再深入一点,因此也看了很多的关于Java集合框架的文章,这篇我算是有一点点的体会,我只是改了一些我认为错误的地方和不通顺...
  • 关于java I/O中flush方法作用的理解

    千次阅读 2016-06-10 10:09:24
    今天在练习使用Serializable过程中,碰到java I/O中的flush()方法,有些不理解。 以前没有用过这个函数,于是就查了一下,但是还是理解的不透彻,后来在论坛上看到一个吧友这样举例说明,瞬间就懂了 !哈哈,这个...
  • Java入门

    千次阅读 多人点赞 2019-04-06 18:54:50
    Java入门 Java 入门 主要内容 Java的地位 Java诞生 Java的特点 安装JDK 简单的Java应用程序 重点与难点: 重点:Java平台无关性、Java程序的结构。 难点:Java程序的开发过程。 Java之父与Java的诞生 Java是1995年6...
  • 众所周知,目前互联网行业是众多行业中薪资待遇最好的,包括程序员、运营、新媒体和这个行业周边的商务、销售等人员的工资,这些都是传统行业从业者工资无法比拟的。 但是2019年起,就有很多人说互联网行业就会进入...
  • 10月25日读者见面会☆★☆★ 清华大学出版社《Java程序员,上班那点事儿》作者:钟声 我遇到有很多在别的行业或职业发展的朋友,通过自己的努力实现了程序员的梦。在很多朋友看来,跨行业的发展是非常难的事情,...
  • 补充:敏捷软件开发的概念已经有很多年了,而且也部分的改变了软件开发这个行业,TDD也是敏捷开发所倡导的。 TDD可以在多个层级上应用,包括单元测试(测试一个类中的代码)、集成测试(测试类之间的交互)、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,244
精华内容 35,297
关键字:

java行业理解

java 订阅