JVM

合集下载

jvmoverloads原理

jvmoverloads原理

jvmoverloads原理摘要:一、JVM 概述1.JVM 的作用2.JVM 的架构二、JVM Overloads 原理1.JVM Overloads 的概念2.JVM Overloads 的工作原理3.JVM Overloads 的优势三、JVM Overloads 的实现1.动态类加载2.动态方法替换3.动态参数调整四、JVM Overloads 的应用场景1.性能优化2.代码隔离3.模块化开发五、JVM Overloads 的局限性与挑战1.兼容性问题2.安全问题3.开发与维护成本正文:一、JVM 概述Java 虚拟机(JVM,Java Virtual Machine)是Java 语言的核心组件,它负责充当Java 代码和底层操作系统之间的中间层。

JVM 具有跨平台特性,可以在任何支持JVM 的操作系统上运行Java 程序。

JVM 的架构包括类加载器、执行引擎、垃圾回收器等部分。

二、JVM Overloads 原理1.JVM Overloads 的概念JVM Overloads,即JVM 超载,是一种动态优化技术。

它允许在运行时根据不同的运行环境动态地加载、替换或调整类和方法的实现,从而提高程序的性能和灵活性。

2.JVM Overloads 的工作原理JVM Overloads 的工作原理主要包括动态类加载、动态方法替换和动态参数调整。

首先,JVM Overloads 会在运行时根据类路径和类加载器策略动态地加载类。

其次,它会对类中的方法进行替换,以实现不同的功能。

最后,它还会根据运行时的参数情况调整方法的参数。

3.JVM Overloads 的优势JVM Overloads 的主要优势在于提高了程序的运行效率和灵活性。

由于JVM Overloads 可以在运行时动态地加载类和方法,因此可以避免一些不必要的类和方法的加载,从而提高程序的启动速度。

同时,JVM Overloads 还可以根据不同的运行环境实现代码的隔离和模块化,使得程序更加灵活和易于维护。

深入分析JVM的优点与缺点

深入分析JVM的优点与缺点

深入分析JVM的优点与缺点JVM(Java虚拟机)是一种在计算机上运行Java字节码的虚拟机,它具有许多优点和一些缺点。

本文将深入分析JVM的优势和不足之处,具体如下:优点:1. 跨平台性:JVM是为Java程序设计语言而创建的虚拟机,可以在不同的操作系统上运行Java程序,无需重新编写或修改代码。

这种跨平台性使得Java成为一种非常流行的编程语言。

2.内存管理:JVM提供了自动内存管理,通过垃圾回收器自动处理内存分配和释放,这样程序员就不需要手动管理内存,减轻了开发人员的负担并且避免了常见的内存泄漏和溢出问题。

3.安全性:通过安全沙箱机制,JVM可以在程序执行期间限制程序对底层系统资源的访问。

这样可以防止恶意软件和病毒对计算机的破坏,提高了安全性。

4. 高可移植性:由于JVM的跨平台性,Java程序一旦在一个平台上编写和测试完成,就可以在其他平台上运行,无需重新编写和调试代码。

5. 高性能:尽管Java是解释型语言,但JVM使用即时编译器(JIT)将Java字节码直接编译成机器码,从而提高了程序的执行效率。

JIT编译器可以对热点代码进行优化,提供接近于本地代码执行的性能。

不足之处:1.内存消耗:JVM启动和运行需要占用较大的内存,而且由于垃圾回收机制,JVM的内存占用也较高。

在一些资源有限的环境中,这可能导致问题。

2. 执行速度:虽然JIT编译器可以提高Java程序的执行速度,但与本地代码相比,Java程序的执行速度仍然较慢。

这一点在对实时性要求较高的应用程序中可能会成为问题。

3.配置复杂性:由于JVM的各种配置选项和优化参数较多,使得调优和优化JVM变得复杂。

不正确的配置可能导致性能下降或其他问题。

4.学习成本:相对于其他编程语言和平台,学习和理解JVM的工作原理和内部机制可能需要更多的时间和精力。

5. 移植性限制:尽管JVM使得Java程序具有高度可移植性,但一些情况下,特定平台的限制或特性可能会对Java程序的移植性产生一些限制。

jvm 的执行流程

jvm 的执行流程

jvm 的执行流程JVM的执行流程JVM(Java虚拟机)是Java语言的核心,它负责将Java源代码编译后的字节码文件解释执行。

JVM的执行流程可以分为加载、验证、准备、解析、初始化、使用和卸载等阶段。

1. 加载加载是JVM执行流程的第一步,它负责将字节码文件加载到内存中。

首先,JVM会通过类加载器(ClassLoader)找到并加载字节码文件。

类加载器会根据类的全限定名查找并加载相应的字节码文件。

一旦字节码文件被加载到内存中,JVM会创建一个代表该类的Class对象,并将其存放在方法区中。

2. 验证验证是JVM执行流程中的第二步,它主要负责验证加载的字节码文件的正确性和安全性。

在验证阶段,JVM会对字节码文件进行各种检查,包括文件格式的验证、语义的验证、字节码的验证和符号引用的验证。

通过验证,JVM可以确保加载的字节码文件是合法且安全的,以防止恶意代码对系统造成损害。

3. 准备准备是JVM执行流程的第三步,它主要负责为类的静态变量分配内存并设置初始值。

在准备阶段,JVM会为每个类的静态变量在方法区中分配内存,并根据变量的类型设置初始值。

这些初始值通常是Java语言中的默认值,如0、null、false等。

4. 解析解析是JVM执行流程的第四步,它主要负责将符号引用解析为直接引用。

在解析阶段,JVM会将字节码文件中的符号引用转换为直接引用,以便后续的内存访问操作。

符号引用是一种符号化的引用,它通过名称来标识一个目标,而直接引用则是一个指向目标的具体指针或偏移量。

5. 初始化初始化是JVM执行流程的第五步,它主要负责执行类的初始化代码。

在初始化阶段,JVM会按照程序的顺序执行类的静态代码块和静态变量的赋值语句。

类的初始化是在首次使用该类之前进行的,它保证了类的静态变量在使用之前已经被正确初始化。

6. 使用使用是JVM执行流程的第六步,它主要负责执行程序代码。

在使用阶段,JVM会按照程序的逻辑顺序执行字节码指令,包括方法调用、变量操作、控制流程等。

jvm最大线程数计算

jvm最大线程数计算

JVM(Java虚拟机)最大线程数的计算可以通过以下几个因素来确定:
1.系统内存限制:JVM 运行时的堆大小和其他内存区域的分配会占用系统内存。

根据
系统可用内存和其他因素,可以确定JVM 可以使用的最大内存量。

一般而言,系统可用内存的一部分会被配置为JVM 的最大堆内存。

2.线程栈大小:每个线程在JVM 中都有一个独立的线程栈。

线程栈的大小会影响可
以创建的最大线程数量。

在不同的操作系统和JVM 版本中,线程栈的默认大小可能有所不同。

3.其他资源限制:除了内存和线程栈之外,还需要考虑其他与线程相关的资源,如文
件描述符、虚拟机进程的最大资源限制等。

总体而言,最大线程数的计算公式可以简化为:
最大线程数= (最大堆内存- 系统保留内存) / 每个线程栈大小
其中,最大堆内存是指在启动JVM 时通过参数设置的最大堆内存大小,系统保留内存是为了保证JVM 和操作系统正常运行而预留的内存。

每个线程栈大小是指JVM 在启动时设置的线程栈大小。

需要注意的是,通过设置最大线程数过大可能导致系统资源耗尽,从而影响应用程序的性能和稳定性。

因此,在计算最大线程数时需要合理评估系统资源和应用程序的需求,并进行适当的调整和优化。

jvm newratio取值范围

jvm newratio取值范围

JVM newratio取值范围1. 什么是JVMJVM(Java Virtual Machine)即Java虚拟机,是Java程序运行的环境。

它是一个能够执行Java字节码的虚拟计算机,它使得Java程序具有跨平台的特性,可以在不同的操作系统上运行。

JVM有自己的内存管理系统,包括堆内存、栈内存等。

其中,堆内存是Java程序运行时的主要内存区域,用于存储对象实例和数组。

2. JVM内存模型JVM内存模型由多个不同的内存区域组成,其中包括堆内存、栈内存、方法区等。

其中,堆内存是Java程序运行时的主要内存区域,用于存储对象实例和数组。

在JVM中,堆内存被划分为两个部分:年轻代和老年代。

年轻代又被划分为三个部分:Eden区、Survivor区(from区和to区)。

3. JVM的垃圾回收JVM通过垃圾回收(GC)机制来自动释放不再使用的内存。

垃圾回收器会定期扫描堆内存,标记出不再使用的对象,并将其回收。

垃圾回收机制是JVM的重要特性之一,它能够提高内存的利用率,减少内存泄漏的风险。

垃圾回收机制中的一个重要参数就是newratio,它决定了年轻代和老年代的比例。

4. newratio的作用newratio是一个用于调整年轻代和老年代比例的参数。

它的值表示老年代与年轻代的比例,默认值为2。

newratio的作用是控制垃圾回收的频率和效率。

较小的newratio值会导致年轻代较小,垃圾回收频率较高;而较大的newratio值会导致年轻代较大,垃圾回收频率较低。

5. newratio的取值范围newratio的取值范围是一个正整数。

它表示老年代与年轻代的比例,例如newratio=2表示老年代是年轻代的两倍。

根据JVM规范,newratio的取值范围是1到100之间的正整数。

但实际上,newratio的值并不是任意取值的,它需要满足一定的条件。

在实际应用中,newratio的取值一般在2到8之间比较合适。

jvm标准参数

jvm标准参数

jvm标准参数JVM标准参数JVM(Java Virtual Machine)是一种虚拟机,它是Java程序的执行环境。

在JVM中,有很多参数可以设置,这些参数可以通过命令行或者配置文件来设置。

这篇文章将详细介绍JVM标准参数。

一、概述JVM标准参数分为两类:通用参数和非通用参数。

通用参数适用于所有的JVM实现,而非通用参数只适用于某些特定的实现。

二、通用参数1. -Xms-Xms是指JVM启动时堆内存的最小值。

例如,-Xms512m表示JVM启动时堆内存的最小值为512MB。

2. -Xmx-Xmx是指JVM启动时堆内存的最大值。

例如,-Xmx1024m表示JVM启动时堆内存的最大值为1GB。

3. -Xmn-Xmn是指新生代的大小。

新生代是指在垃圾收集中被划分为年轻代和幸存区的内存区域。

例如,-Xmn256m表示新生代大小为256MB。

4. -XX:PermSize-XX:PermSize是指永久代(Permanent Generation)大小。

永久代是一种特殊的内存区域,它主要用于存放类信息、常量池等数据。

例如,-XX:PermSize=64m表示永久代大小为64MB。

5. -XX:MaxPermSize-XX:MaxPermSize是指永久代的最大值。

例如,-XX:MaxPermSize=128m表示永久代的最大值为128MB。

6. -Xss-Xss是指每个线程的堆栈大小。

例如,-Xss256k表示每个线程的堆栈大小为256KB。

7. -XX:+UseParallelGC-XX:+UseParallelGC是指使用并行垃圾收集器。

并行垃圾收集器可以在多个CPU上同时进行垃圾收集,从而提高垃圾收集效率。

8. -XX:+UseConcMarkSweepGC-XX:+UseConcMarkSweepGC是指使用CMS(Concurrent Mark Sweep)垃圾收集器。

CMS垃圾收集器可以在应用程序运行时进行垃圾回收,从而减少应用程序停顿时间。

JVM运行机制及其原理

JVM运行机制及其原理

JVM运行机制及其原理JVM(Java Virtual Machine)是Java虚拟机的缩写,是运行Java 字节码的虚拟计算机。

它是Java平台的核心组件,负责在不同的操作系统上执行Java程序。

JVM运行机制主要包括类加载、字节码解释、即时编译、垃圾收集等过程,下面将详细介绍JVM运行机制及其原理。

1.类加载当一个Java程序被运行时,JVM会首先加载程序的主类,然后根据程序的依赖关系逐步加载相关的类。

类加载过程主要分为加载、验证、准备、解析和初始化几个阶段:-加载:通过类加载器将类文件加载到内存中。

- 验证:确保加载的类符合Java语言规范和JVM规范。

-准备:为类的静态变量分配内存并初始化为默认值。

-解析:将符号引用转换为直接引用。

-初始化:执行类的初始化方法。

2.字节码解释加载完类文件后,JVM会通过解释器将字节码文件逐条解释执行,将每条字节码翻译成对应的机器代码并执行。

这种方式简单直接,但效率较低,适用于少量代码和频繁切换的情况。

3.即时编译4.垃圾收集JVM还负责管理程序的内存,包括分配内存、回收无用内存等。

在Java中,内存是通过堆和栈来管理的,堆用于存放对象实例,栈用于存放基本数据类型和方法调用。

JVM通过垃圾收集器来管理堆内存,自动回收不再使用的对象,并将内存释放出来供其他对象使用。

5.类加载器类加载器是JVM的重要组成部分,负责加载class文件,并将其转换成JVM可以识别的数据结构。

JVM中存在多个类加载器,分为三个级别:启动类加载器、扩展类加载器和应用程序类加载器。

类加载器采用双亲委派模型,当需要加载一个类时,先委托给父类加载器加载,只有当父类加载器无法找到类时,才由自己加载。

6.内存模型JVM中的内存分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等几部分。

程序计数器记录当前指令执行的位置;虚拟机栈用于存放局部变量表和操作数栈;本地方法栈用于支持本地方法调用;堆用于存放对象实例;方法区用于存放类信息、静态变量等。

jvm 的原理

jvm 的原理

jvm 的原理JVM(Java Virtual Machine)是一种能够执行Java字节码的虚拟机。

它是Java技术的核心,负责将Java源代码编译为平台无关的字节码,并在不同的操作系统上执行这些字节码。

JVM的原理可以简单概括为以下几个方面:1. 类加载:JVM首先通过类加载器加载Java源代码编译生成的字节码文件。

类加载器将字节码文件加载到JVM中,并解析字节码文件的结构,创建对应的类模板。

2. 内存管理:JVM将内存划分为不同的区域,包括堆、栈、方法区等。

其中,堆是用于存储对象实例的区域,栈用于存储方法的调用栈,方法区则存储类的元数据信息。

JVM通过垃圾回收机制自动管理堆内存,释放不再使用的对象。

3. 即时编译:JVM在执行字节码时,会将热点代码(即频繁执行的代码)通过即时编译器(Just-In-Time Compiler)编译为本地机器码,以提高执行效率。

即时编译器会根据运行时的情况进行优化,如方法内联、循环展开等。

4. 解释执行:对于非热点代码,JVM会使用解释器将字节码逐条解释执行。

解释器将字节码转换为机器码并执行,但执行效率相对较低。

5. 安全机制:JVM提供了安全管理器(Security Manager)来保护系统安全。

安全管理器可以控制JVM对外部资源的访问权限,防止恶意代码对系统造成破坏。

6. 异常处理:JVM提供了异常处理机制来处理程序中的异常情况。

当程序发生异常时,JVM会根据异常处理器(Exception Handler)的配置,选择相应的处理方式,如打印异常信息、捕获并处理异常等。

7. 多线程支持:JVM支持多线程并发执行。

它通过线程调度器(Thread Scheduler)来调度各个线程的执行顺序,实现多线程的并发执行。

8. 跨平台性:由于JVM将字节码作为中间语言,可以在不同的操作系统上执行Java程序。

这使得Java具有较好的跨平台性,只需在不同平台上安装对应的JVM即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JVM调优实战付增斌日期:2009-05-21目录1 理论篇 (1)1.1 多功能养鱼塘-JVM内存 (1)1.2 池塘中的鱼-程序中的对象 (2)1.3 养殖区域划分-JVM中的代 (2)1.4 主人定期捕鱼-JVM垃圾回收 (4)1.5 不同的捕鱼方式-垃圾回收器 (5)1.6 捕鱼工具选择-JVM参数 (7)2 实战篇 (16)2.1 测试目的 (16)2.2 测试环境准备 (16)2.3 录制测试脚本 (17)2.4 定义测试场景 (17)2.5 执行初步性能测试 (17)2.6 选择调优方案 (18)2.7 调优后JVM监控图 (21)2.8 测试结果分析 (24)3 性能问题举例 (25)3.1 性能症状 (25)3.2 监控结果 (25)3.3 原因分析 (28)3.4 该系统的JVM设置 (29)4 后记 (29)5 附:舍得网的典型配置 (30)1理论篇1.1多功能养鱼塘-JVM内存大鱼塘O(可分配内存):JVM可以调度使用的总的内存数,这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。

小池塘A(堆内存):JVM运行时数据区域,它为类实例和数组分配的内存。

堆可以是固定大小的也可以是可变大小的。

其中Heap = {Old + NEW = { Eden , from, to } }。

小池塘B(非堆内存):包括所有线程之间共享的一个方法区域和JVM为优化或内部处理所分配的内存。

它存储每一个类的结构,如一个运行时的常量池、字段和方法数据、方法的代码和构造函数。

这个方法区是逻辑上堆的一部分,但依赖于实现,一个JVM可以不去回收或者压缩它。

像堆一样,方法区可以固定大小的,也可以是大小可变的。

方法区不是必须是连续的,它们可以是不连续的。

除方法区之外,JVM总是从非堆中分配用于优化和内部处理所需的内存。

例如,JIT编译器为高性能的JVM代码转换存储成本地代码而分配的内存。

整个池塘结构图如下:查看大池塘O大小的方法为:在命令行下用java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,示例如下:java -Xmx3072M -version。

当一个URL被访问时,内存申请过程如下:A. JVM会试图为相关Java对象在Eden中初始化一块内存区域B. 当Eden空间足够时,内存申请结束。

否则到下一步C. JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收), 释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区D. Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor 区的对象会被移到Old区,否则会被保留在Survivor区E. 当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)F. 完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”1.2池塘中的鱼-程序中的对象程序中运行的各种类实例称之为对象,每个对象都有不同的生命周期,有的存活时间长点,有的存活时间断点,这就想鱼塘中养的不同生长期的鱼一样,有的三个月就可以上市,有的鱼则需要6个月甚至更长的时间才能上市。

JVM内存机制的设置就是为了要满足这种不同生命周期的对象对内存的需求,并使之能达到最大的性能表现。

1.3养殖区域划分-JVM中的代鱼塘主人为了充分利用现有的条件来赚取更多的利润,他需要喂养各种不同种类的鱼,于是又把鱼塘分割成了几块不同区域:“鱼苗养殖区”、“短中期养殖区”、“长期养殖区”,来养殖不同生长周期的鱼。

JVM同样为了对各种不同生命周期的对象进行有效管理也划分了各种不同的区域,这就是“代”的概念,分别叫作:“青年代”、“老年代”、“持久代”,下面逐一介绍每个代的含义和作用。

短中期鱼苗养殖区-年青代(Young Generation)年青代由一个Eden Space和两个Survivor Spaces组成,虚拟机初始时分配所有的对象到Eden Space,许多对象也是在这里死去。

当它执行一个“minor GC”的时候,虚拟机将从Eden Space中移动一些残余的对象到其中的一个Survivor Spaces中。

青年代就好像养鱼塘中的“中短期养殖区”一样,主人把鱼先投放到“短期养殖区”喂养,隔一段时间就开始下网捞出已经长成的那些鱼拿到集市去卖,这个过程就是从“Eden Space”中执行垃圾回收的过程。

主人接着把捕捞之后剩下的“漏网之鱼”赶到“中期养殖区”继续喂养。

这个“中期养殖区”就是“Survivor Spaces”,当然鱼在“中期养殖区”喂养一段时间后也要捞出那些长成的鱼去卖,这就是对“Survivor Spaces”执行垃圾回收的过程。

Ps Eden Space: 这个内存池在对象初始化时被分配;Ps Survivor Space: 这个内存池中包含着Eden Space 经过GC之后幸存下来的对象;年轻代设置策略:对于响应时间优先的应用需尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。

在此种情况下,年轻代收集发生的频率也是最小的。

同时,减少到达老年代的对象。

对于吞吐量优先的应用则尽可能的设置大,可达到Gbit的程度。

因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

长期养殖区-老年代(老年代):、虚拟机将在Survivor Spaces中生存足够长时间的对象移动到老年代的Tenured Spaces 中。

当Tenured Generation被填满,则将执行一个完全GC,这个完全GC非常的慢,因为它要处理所有存活着的对象,用的是串行标记收集的方式,并发收集可以减少对于应用的影响。

老年代设置策略:对于响应时间优先的应用,老年代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。

如果堆设置小了,可能会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。

最优化的方案,一般需要参考以下数据获得:并发垃圾收集信息持久代并发收集次数传统GC信息花在年轻代和老年代回收上的时间比例减少年轻代和老年代花费的时间,一般会提高应用的效率对于吞吐量优先的应用,一般吞吐量优先的应用都有一个很大的年轻代和一个较小的老年代。

原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽存放长期存活对象。

较小堆引起的碎片问题:因为老年代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。

当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。

但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。

如果出现“碎片”,可能需要进行如下配置:-XX:+UseCMSCompactAtFullCollection 使用并发收集器时,开启对老年代的压缩;-XX:CMSFullGCsBeforeCompaction=0上面配置开启的情况下,这里设置多少次Full GC后,对老年代进行压缩。

/*监控实例*/内存池名称: Tenured GenJava 虚拟机最初向操作系统请求的内存量: 3,538,944 字节Java 虚拟机实际能从操作系统获得的内存量: 1,431,699,456 字节Java 虚拟机可从操作系统获得的最大内存量: 1,431,699,456 字节。

请注意,并不一定能获得该内存量。

Java 虚拟机此时使用的内存量: 1,408,650,472 字节/*监控实例*/实例说明:系统能获得的最大Tenured Generation空间大小为1.431G左右,此时使用已经1.408G,基本满了,所以在JVM执行串行标记垃圾收集时,系统响应速度会很慢!鱼苗养殖区-持久代(Permanent Generation)控制着所有虚拟机自己映射的数据,如类和对象的方法。

在持久代中jvm则存储class 和method对象。

持久代就像鱼苗养殖区一样,池塘主人一次放该区域投入足够量的鱼苗,已保证其他鱼塘的足够供应。

就配置而言,永久域是一个独立域并且不认为是堆的一部分。

永久域默认大小为4m.运行程序时,jvm会调整永久域的大小以满足需要。

每次调整时,jvm 会对堆进行一次完全的垃圾收集。

使用-XX:MaxPerSize标志来增加永久域搭大小。

在WebLogic Server应用程序加载较多类时,经常需要增加永久域的最大值。

当jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小。

为了避免调整,可使用-XX:PerSize标志设置初始值。

1.4主人定期捕鱼-JVM垃圾回收一个池塘收容积限制,能养殖的鱼的数量是一定的,因此隔一段时间必须捞出部分长成的鱼来使主人能喂养跟多的鱼。

同样,JVM所管理的有限内存也要实现最优化利用,Garbage Collection(GC)就是用来释放没有被引用的对象所占领的内存,目的在于清除不再使用的对象。

GC通过算法和参数的配置可以对性能产生效果显著的影响。

GC就好像把长成的鱼从池塘中捞出来拿到市场上去卖,然后给池塘腾出空间继续养别的鱼赚钱。

采用哪种养殖方式能让鱼塘主人赚到更大的利润是鱼塘主人的经营目的,而JVM 调优的目的在于如何能是系统表现出更好的响应时间、更大的吞吐量。

Minor Collections(局部垃圾回收):当通用内存消耗完被分配的内存时,JVM会在内存池上执行一个局部的GC(总是调用minor collection)去释放被dead的对象所占用的内存。

这个局部的GC通常比完全GC要快许多。

青年代中的垃圾回收就是采用局部垃圾回收机制,因此,青年代中内存分配和管理效率也是最高。

通常情况下,对于内存的申请优先在青年代中申请,当内存不够时会整理新生代,当整理以后还是不能满足申请的内存,就会向老年代移动一些生命周期较长的对象。

这种整理和移动会消耗资源,同时降低系统运行响应能力,因此如果青年代设置的过小,就会频繁的整理和移动,对性能造成影响。

那是否把年青代设置的越大越好,其实不然,青年代采用的是复制搜集算法,这种算法必须停止所有应用程序线程,服务器线程切换时间就会成为应用响应的瓶颈。

Major Collections(完全垃圾回收):当老年代需要被回收,这就是一个major collection ,它的运行常常非常慢,因为它要涉及所有存活着的类。

相关文档
最新文档