选择JVM部署模型
JVM部署模型的选择总体来说就是决定应用是部署在单个JVM实例还是多个JVM实例上(这里简单举例说明一下JVM实例,比如:我们常用eclipse开发,启动一个eclipse就是启动了一个JVM实例,然后在JVM中运行一个main程序,又会启动一个JVM实例,两个JVM实例是隔离开的)。哪一个是最适合你的应用的呢?这个是前面说到系统需求和潜在规则来决定的。比如说:假如你要部署您的应用在一个64位的机器上面,可以支持更大Java堆,如果应用依赖第三方的本地代码组件,而且这个第三方暂时不支持64位机器,那么你就必须要强制使用32位的JVM而且要使用更小优化的Java堆。
单实例JVM模型
在单实例的JVM上部署应用,有一个好处,就是可以减低管理成本,毕竟有更少的JVM需要去维护嘛。应用能够使用的总内存更小,由于每一个单独部署的JVM有能够使用的内存上限。
部署应用在单个JVM上存在的挑战是应用的可用性存在极高的风险,比如:JVM失败或者应用灾难性错误。
多实例JVM模型
部署Java应用在多个JVM上面有提高可用性和能够间接降低延迟的好处,由于应用部署在多个JVM上,某一个JVM出错,只会导致应用某部分无法使用,不会导致整个应用无法使用。多JVM部署可以提供低延迟,在多JVM部署中,Java堆的大小倾向于更小,更小Java堆可以允许有更小的垃圾回收暂停,垃圾回收器的暂停是明显影响延迟。另外,如果应用存在明显瓶颈,多个JVM部署可能帮助提升吞吐量,把压力分布到多个JVM上面,可以让用承受更大的压力。
使用多个JVM,JVM可能会和处理器绑定。把JVM和处理器绑定在一起,可以避免应用和JVM的线程在多个CPU上切换,提升CPU cache的命中率。
部署多JVM的挑战在于管理、监控和维护需要更多的努力。
一般的建议
没有最好的JVM部署模型,做出最合适的选择依赖于系统的需求,系统的需求才是最重要的。
一个约束需要意识到的是,如果Java应用需要大量的内存占用,把应用部署在单个JVM上面可能需要使用64位JVM上,64位可以提供比32位JVM更大Java堆大小。如果使用64位JVM,需要保证应用使用的任何第三方软件需要支持64位。另外,如果任何使用JNI去调用本地组件,不管是第三方组件还是自己应用开发的程序,需要确保的是他们必须在64位环境下编译。
根据作者的经验来看,越少的JVM数量越好,毕竟越容易维护。
选择JVM Runtime
为Java应用选择JVM Runtime,就是根据实际情况来选择使用合适的client或者server。
Client或者Server Runtime
当使用HotSpot VM的时候,有两种可以选择的JVM runtime。client runtime是快速启动,更小的内存占用以及快速代码(机器码)生成的JIT编译器。server runtime有更复杂的代码生成优化,作为服务型应用更为靠谱。在server runtime中可以发现针对JIT编译器有很多的优化,主要是收集了更多的关于程序的信息,以生成更高性能的代码。
第三种HotSpot VM runtime还在开发中,叫做tiered,他结合了client和server runtime优秀面,即更快的的启动时间和更高性能的生成代码。如果你使用的是Java 6 Update 25,Java 7或者更新的版本,你也许可以考虑使用tiered server runtime替换client runtime。要使用tiered server runtime可以使用这个命令行选项:-server -XX:+TieredCompilation。在这本书编写的时候,还不是极力推荐替换掉client runtime或者server runtime。
小提示:如果你不知道该如何选择,可以先选择server runtime。如果启动时间和内存占用无法接受,可以考虑切换成client runtime或者tiered runtime。依赖于你是使用什么版本的JVM。
32位或者64位JVM
除了client和server runtime的选择,还需要在32位或者64位之间做出选择,HotSpot VM的默认配置是32位的。做出32位和64位的选择取决于应用需要的内存占用以及依赖的第三方库是否支持64位系统——如果有通过JNI使用本地接口。决定应用需要消耗的内存占用,会在下节中介绍。下面的表格列出了一些指导帮助在32位JVM或者64位JVM之间做出选择。注意的是HotSpot VM还没有64位的client runtime。
垃圾回收器
在进入下一步优化之前,需要先做出选择初始的垃圾回收器。在HotSpot VM里面有好几种垃圾回收器可以使用:serial,throughput,mostly concurrent以及garbage first。
由于使用throughput垃圾回收器有可能能够满足应用对暂停时间的需要,可以优先选择throughput垃圾回收器,如果有需要再切换到concurrent垃圾回收器(CMS)。如果有切换到concurrent垃圾回收器的需要,我们将会在后面的优化延迟的时候讨论 。
使用throughput垃圾回收器可以通过HotSpot VM的命令行参数来指定:-XX:+UseParallelOldGC或者-XX:+UseParallelGC。 如果在你的HotSpont VM的版本上-XX:+UseParallelOldGC选项不能使用,使用+XX:UseParallelGC。两者的不同点在于,-XX:+UseParallelOldGC促发了多线程young代的垃圾回收和多线程old代的垃圾回收,也就是说minor垃圾回收和full垃圾回收都是多线程的。+XX:+UseParallelGC仅仅是young代的垃圾回收是多线程的,old代的垃圾回收的单线程的。因此,如果你想要young代和old代的垃圾回收都是多线程的就配置-XX:+UserParallelOldGC。而且-XX:+UserParallelOldGC是兼容-XX:+UseParallelGC。
相关推荐
### JVM内幕:java虚拟机详解 #### 一、概述 ...理解JVM的工作原理对于优化Java程序、解决性能问题具有重要意义。通过深入学习JVM的各个组件及其工作方式,开发人员可以更好地掌握Java编程技巧,提升软件质量。
JVM内存模型的理解和优化,对于解决性能瓶颈、避免内存泄漏以及提高系统稳定性至关重要。本文将详细探讨JVM的内存结构,以及如何进行有效的调优。 一、JVM内存结构 1. **程序计数器(Program Counter Register)**...
#### 二、JVM内存模型 **2.1 JVM规范** JVM规范定义了JVM的基本架构,包括两个子系统和两个组件: - **Classloader(类装载器)子系统**:负责加载Java类到方法区。 - **Execution Engine(执行引擎)子系统**:...
二、JVM内存模型 JVM内存模型共分为5个区:堆(Heap)、方法区(Method Area)、程序计数器(Program Counter Register)、虚拟机栈(VM Stack)、本地方法栈(Native Method Stack)。其中,堆(Heap)、方法区...
#### 二、JVM内存模型详解 JVM内存模型主要包括以下几个部分: 1. **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每个线程都有一个私有的程序计数器。 2. **Java虚拟机栈(Java ...
在部署Java Web应用时,Tomcat作为常见的容器之一,其JVM内存设置同样至关重要。以下是在Tomcat环境中优化JVM内存的具体步骤: 1. **环境变量设置**:通过设置`CATALINA_OPTS`环境变量,可以在系统级别全局地调整...
JVM的内存模型包括堆、栈、方法区、本地方法栈和程序计数器等,这些区域各自承担着不同的职责,如存储对象实例、管理方法调用等。JVM的垃圾回收机制也是其一大特点,自动管理内存,避免了程序员手动进行内存管理。 ...
* 方法栈:方法栈是 JVM 的内存模型的一部分,负责存储方法的局部变量和参数。 * 堆:堆是 JVM 的内存模型的一部分,负责存储对象的实例。 * 程序计数器:程序计数器是 JVM 的内存模型的一部分,负责存储当前执行的...
JVM 原理讲解和调优 JVM(Java Virtual Machine,Java 虚拟机)是 Java 语言的核心组件,它是一个虚构出来的计算机,是通过在实际的计算机上...了解 JVM 的原理和机制可以帮助我们更好地优化 Java 应用程序的性能。
JVM(Java虚拟机)是Java语言运行的基础,它负责执行Java字节码,并且是...开发者可以通过对JVM进行调优,结合业务场景和应用需求,合理配置JVM内存大小、调整垃圾回收策略和类加载机制,从而达到优化应用性能的目的。
### JVM优化与OOM分析 #### 一、JVM的重要性与作用 JVM(Java Virtual Machine)作为Java程序的运行环境,对于确保Java程序能够跨平台运行具有重要意义。它不仅提供了执行字节码的基础,还负责内存管理、垃圾回收...
5. 跨平台性:Java程序能够在任何安装了JVM的平台上运行,这使得Java应用的部署和分发更为方便。 6. 社区支持:Java拥有庞大的开发者社区,这为学习、使用Java以及遇到问题时的求助提供了极大的便利。 在Android...
6. 性能优化:理解JVM的内存模型和垃圾回收机制对于性能调优至关重要。开发者需要根据不同的应用场景和需求,对JVM进行合理配置,比如调整堆大小、选择合适的垃圾回收器、进行内存泄漏检测等。 7. 跨平台原理:JVM...
对于Java开发者,尤其是面试阶段,深入理解JVM的工作原理和优化技巧是必不可少的。以下是一些关于JVM的常见面试题和相关知识点: 1. **JVM的组成** - **类装载器(ClassLoader)**:负责加载类文件到JVM内存中,分为...
2. **运行时数据区(Runtime Data Area)**:包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。 3. **执行引擎(Execution Engine)**:执行字节码,包含解释器和即时编译器(JIT)。 4. **本地方法接口(Native ...
其中,JDK(Java Development Kit)、JRE(Java Runtime Environment)和JVM之间的关系尤为重要。简单来说: - **JDK**包含了JRE,并且增加了编译器、调试器和其他开发工具,是Java开发者必备的工具包。 - **JRE**...
2. 自适应优化:通过解释器和JIT(Just-In-Time)编译器的协作,JVM能够监控热点代码(经常执行的部分),并进行优化编译。 3. 垃圾回收机制:JVM提供了多种垃圾收集器,如Serial GC、Parallel GC、CMS(Concurrent...
JDK 是开发和运行 Java 应用程序所需的一组工具和库的集合,包括 JRE(Java Runtime Environment)和开发工具。 JVM(Java Virtual Machine)是 JDK 的核心组成部分,它负责执行字节码,提供了一个“一次编写,到处...
从零开始学习并掌握Java虚拟机(JVM)的相关知识对于任何希望深入理解Java程序运行机制的开发者来说都是一项重要技能。本篇文章将基于提供的文件标题、描述以及部分链接信息来构建一系列关于JVM的核心知识点。 ### ...
淘宝作为大型电商平台,其内部对JVM的优化和管理有着深入研究。学习这份资料,你将了解如何调整JVM参数以优化性能,如何解决内存溢出问题,以及如何分析和理解GC日志,从而更好地应对大规模并发场景下的挑战。 总的...