Java 最初诞生的时候,它可以说是其他语言的进化版。不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机。它还是垃圾收集站,从而令存储管理和内核转储(core dump)不再是麻烦。当然还有它相当全面的类库。虽然它没有什么惊世的新性能,但它把许多语言的优点基于一身。
Java本来是一个简单独一的语言,但是Sun在长期运营Java的过程中出现了很多错误,比如将语言与runtime合用一个名字,从而使得用户在识别JVM语言项目如Jython、JRuby时难以从思想上隔离Java。最主要的是这样对runtime很不公,因为Java Virtual Machine (JVM)有很多自己的独特之处。
1、 缺点
没有一种技术是完美的,JVM也不例外。如果你工作在一个没有Java语言配置的设备上,JVM便无用武之地。JVM为其他语言提供了基础,但JVM最初不是为这个理念设计的。比如我们作为分配对象来维护我们的堆栈时,通常我们会直接操作实时堆栈并添加我们维护所需的其他字段,除此之外再没有控制堆栈的更好的方法。
还有,当我们创建一个Ruby Fixnum时也很麻烦,我们把这些值用一个Java对象包装。Ruby的C implementation不过只是传递tagged ints,因为没有包装他们就不会符合各种列表,所以Java 基元(Java primitives)也不会切割它。
顺便说一下:JVM的启动时间也挺长。
那些为JVM编写高性能代码的开发者会觉得经常被JVM的black box特性所折磨,一旦你加载你的字节码,你就觉得像是摇动的游戏手柄一样忐忑,不知道结果如何,black box就是意味着不可知。
2、 优点:
HotSpot(Java 虚拟机)
对于初学者来说,尽管Hotspot有些神秘,但是性能方面它确实很棒,因为动态建模(dynamic profiling)是优良性能的捷径。HotSpot从运行应用中采样数据,从而可以优化代码,进而得到良好性能。它相当于以模仿人工的方法进行优化。在程序运行的开始,Java代码仍然解释执行,但HotSpot引擎开始进行采样(Profiling)。HotSpot引擎可以集中精力来对HotSpot代码进行深度优化,从而使这部分代码的执行更加迅捷。因此当HotSpot优化时,它为优化设立了一层保护来确保优化的基本原理有效;但当这层保护失效时,优化就会很慢。
这里是Hotspot在使用中的一个演示:
在图表中我们运行了一个Mandelbrot Generator很多次,然后测绘它每次生成的时间。你会看到JRuby 1.4.0明显比Ruby 1.8.7以及1.9.2preview2表现更好。如果只看JRuby的起点,会发现比1.8.7慢,但当Hotspot运行后时间曲线迅速下降。
这里有个有趣的始建波动发生在循环6那里:实际上那是因为HotSpot的动态反优化启动。然后时间波动回到原来状态,优化结束。
Hotspot已经被全世界的开发者和拥趸支持了近十年,Java 4, 5, 6之间的提升让人印象深刻。每一次它的升级,性能都会有很多提升,它真是的是JVM的一大利器。
3、 垃圾回收Garbage Collection (GC)
Java开发者花费大量时间来调试、测试、提高他们的VM,单是Garbage Collection的开发和维护就持续了15个年头,由此可见它的性能!而且JVM发布了多个垃圾回收器,所以这样一来即使加载的负荷超过了JVM中一个Garbage Collection,JVM也还可以允许你使用其他的Garbage Collection。因此,你可以自己调整任何你所使用的Garbage Collection,使之符合你的应用。
各种各样的回收站发挥着不同的作用。它们全部是压缩过的,所以不必担心存储的问题。它们都是增量型的(incremental)以缩短GC停滞的时间;它们还是分代的(generational),所以短时对象(short-lived object)回收得更快(想了解更多,请参见我的博客:Java 内存模型及GC原理)。有些是并行的,从而回收工作可以在多个核上分开运行;甚至还有同时发生的Garbage Collection,这样就没有了停滞时间。JRuby可以免费得到这些,现在的Java 7以及Java 6的u12,甚至还有一个新的G1回收站。
关于GC和JVM还有两个很巧妙的地方,从中可以获悉GC运行虚拟化和信息的情况。第一个是-J-verbose:gc flag,从中可以得到回收事件发生的时间、数量以及花费的时间,这可以让我们获悉垃圾回收器处理工作负载的好坏状况:
[GC 16000K->3727K(82496K), 0.0396636 secs]
[Full GC 13021K->5802K(82496K), 0.1468975 secs]
[GC 21802K->9769K(82496K), 0.0292348 secs]
[GC 25769K->12535K(82496K), 0.0243674 secs]
[GC 28535K->13136K(82496K), 0.0169928 secs]
[GC 29136K->15498K(82496K), 0.0213308 secs]
[GC 31498K->16911K(82496K), 0.0213301 secs]
[GC 32911K->19413K(82496K), 0.0186457 secs]
[GC 35413K->20207K(82496K), 0.0146396 secs]
你可以记录这些事件并且计算出清理垃圾所需的总时间,还可以计算出你加载的工作负荷是否超过了回收器的能力,这可以帮助改变你的设计并通过调节堆栈大小来适配回收器。
第二个是通过JConsole查询JVM状况。JConsole可以从许多角度查看系统,而且有一个很棒的memory tab来展示GC的运行状况,如下:
在右下角你可以看到绿色的框格,从中可以看到不同的生成占存储的多少。比如说你看到一个近乎满的survivor 生成,那意味着慢的满GC收集时刻,那么意思就是说这个应用可能不是很健全。
4、 JVM特性
1)移植性
无论是GC还是Hotspot都可以用在任何Java可用的地方。比方说,JRuby可以运行在其他平台上,Rails应用就可以运行在IBM主机上的JRuby上,而且这台IBM主机运行的是CP/CMS。实际上,由于Java和OpenJDK项目的开源,我们正在看到越来越多的平台的衍生,因此JVM的移植性也将越来越棒。
2)成熟
JVM已有超过15年的历史,在过去的这些年里,许多开发者为它做出了许多贡献,使得它的性能一次又一次地提升,让JVM变得更加稳定、快速和广泛。
3)覆盖面
JRuby和JVM上的其他语言项目已经被开发者所承认,一个典型的例子是invokedynamic specification (aka JSR292)。JSR越来越配合新的语言,JVM已不再是Java一个人定制规则。JVM正在构建成为类如JRuby等项目的优良平台。
还有一个MLVM(multiple language VM)项目,好比是新特性的清算机构,是一个许多企业应用的开发者试图添加应用的地方,而这些应用正是他们想在JVM中看到的。而且JVM开发者互相协作、彼此影响,无疑这有利于JVM新特性的诞生。
这些细节都可以看到JVM正在关注开发者的需求,扩大他的覆盖面。
5、 总结
JVM已经成为技术界越来越稳定的产品,Oracle/Sun的合并以及其他可能的商业闹剧都不会影响这一点。许多技术大鳄级公司(如Oracle、IBM、HP、SAP)已经为编写JVM的中间软件花了如此多的钱,以至于在下个十年里他们可能不会再为JVM的发展做太大的贡献。
英文原文:J is for JVM: Why the ‘J’ in JRuby?
分享到:
相关推荐
本教程——“深入JVM内核—原理、诊断与优化视频教程”着重讲解了JVM的内部机制,特别是关于垃圾收集(Garbage Collection, GC)的算法和种类,这对于理解和提升Java应用性能至关重要。 一、JVM内存模型 首先,...
3. **性能优化**:涉及硬件配置、JVM调优、索引刷新策略、搜索分析器的选用等多个方面。 4. **安全性**:保护数据安全,防止未授权访问,需要配置SSL/TLS加密、实施用户权限控制。 5. **监控与维护**:定期检查...
本文将深入探讨JVM的组成、垃圾收集的基本概念及其常见算法,以及如何进行性能调优。 首先,JVM主要由以下几个部分组成: 1. **类装载器**:负责加载类文件,完成类的加载、验证、准备和初始化等工作。 2. **运行...
Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码并管理内存。在面试中,了解JVM的各个组件、内存区域、...在面试中,能够详细阐述这些概念并结合实际经验进行讨论,将展示出对JVM深入的理解和实践经验。
本文主要介绍了深入理解JVM之类加载机制的知识点,结合实例形式详细分析了类加载机制原理、过程及相关操作注意事项。 1. 类加载机制概述 类加载机制是Java虚拟机把描述类的数据从Class文件加载到内存,并对数据...
深入了解JVM字节码增强技术 JVM字节码增强技术是Java开发中的一种技术,它可以在Java字节码生成之后,对其进行修改,增强其功能。这种技术可以减少冗余代码,提高性能等。 主要知识点: 1. Java字节码增强的定义...
这篇文章将深入探讨Python与Java之间的对比,以帮助开发者更好地理解这两者之间的差异,并在实际项目选择中做出明智的决策。 首先,Python以其简洁明了的语法而闻名,这使得它成为初学者入门的理想选择。Python代码...
在本文中,我们将对 2019 金三银四 30 家公司面试题汇总进行深入分析,从 Java 基础到高并发、Spring、数据库、消息队列、分布式系统和 JVM 等技术栈进行讨论。 一、Java 基础 Java 基础知识点包括集合框架的继承...
本文将深入探讨几种主流的编程语言——C、C++、Java、.NET、Ruby以及JavaScript,分析它们的优缺点。 1. **C语言** - **优点:** - 面向过程,以函数为中心,简洁高效。 - 靠近机器层,可以直接操控硬件,执行...
1. **串行GC**:主要用于小规模应用,单线程执行GC,优点是简单高效,缺点是会暂停应用程序执行(Stop-The-World)。 2. **并行GC**:多线程进行GC,提高了效率,但仍存在Stop-The-World问题。 3. **并发GC**:如...
Java性能调优,特别是关于垃圾回收...总结来说,Java性能调优中的垃圾回收机制分析是一项深度工作,需要深入理解JVM的内存管理,识别并避免内存泄漏,以及合理调整垃圾收集策略,以实现更高效、更稳定的Java应用程序。
### Java堆的管理—垃圾回收机制的算法分析与研究 #### 摘要 本文深入探讨了Java垃圾回收机制的特点及其在Java虚拟机(JVM)中的应用,并详细分析了几种典型的垃圾收集算法。此外,文章还介绍了如何通过命令行参数...
- JVM内存模型:深入理解堆、栈、方法区等组成部分的作用。 - 垃圾回收机制:GC算法的工作原理及其优化策略。 - 类加载机制:双亲委派模型的工作流程及优点。 - **数据库基础知识** - SQL语言:掌握基本的SQL...
本文主要探讨了基于Model-View-Presenter(MVP)模式的Android App架构设计,并通过具体案例进行了深入分析。 一、Android系统App设计架构分析 Android系统的架构基于Linux内核,分为四层:Linux内核层、系统运行...
对于MyBatis的面试题,你需要了解MyBatis的基本概念、优点和缺点,以及它与Hibernate的区别。MyBatis的优势在于灵活的SQL映射和良好的性能,但可能会增加开发人员的编码工作量。${}和#{}的区别在于安全性与预编译...
它的优点在于简单且资源消耗低,但缺点是在GC期间会暂停所有用户线程(Stop-The-World事件)。 2. **并行GC(Parallel GC)**:与串行GC相比,它在多处理器机器上通过使用多个线程进行垃圾收集,从而显著提高了GC...
2. **内存管理**:深入分析HotSpot如何处理内存分配、垃圾回收等操作。 3. **编译器优化技术**:探讨HotSpot编译器是如何进行代码优化的,从而提高应用程序的执行效率。 4. **性能监控工具**:提供了一系列工具,...
- 题目:对比ArrayList和LinkedList,分析其在不同场景下的优缺点。 - 答案:ArrayList基于动态数组,访问速度快,插入和删除元素性能相对较差。LinkedList基于双向链表,插入和删除快,但随机访问慢。 3. **多...
【标题】:“C++ & C#” 【描述】:“这是一本书...然而,这里主要讨论的是Java的堆栈内存管理,对于C++和C#的具体知识,例如C++的堆栈管理、C#的垃圾收集以及它们各自的数据类型和内存模型,需要更深入的学习和分析。
### 数据结构与算法分析(Java版) #### 数据结构概述 数据结构是计算机科学的一个核心概念,它主要研究如何在计算机中有效地组织和存储数据。良好的数据结构设计能够提高程序的效率,减少资源消耗,使软件系统...