JVM内存管理和垃圾回收机制
- 格式:doc
- 大小:246.00 KB
- 文档页数:9
jvm的gc原理JVM的GC原理一、概述JVM(Java虚拟机)是Java程序运行的环境,其中最重要的组成部分之一就是垃圾回收(Garbage Collection,简称GC)机制。
GC的作用是自动管理程序中的内存,及时释放不再使用的对象,以避免内存泄漏和内存溢出的问题。
本文将对JVM的GC原理进行详细介绍。
二、垃圾回收算法1. 标记-清除算法标记-清除算法是最基本的垃圾回收算法之一。
它的过程分为两个阶段:标记阶段和清除阶段。
在标记阶段,GC会从根节点(一般是程序中的静态变量和栈中的引用)开始,递归地遍历对象图,标记出所有被引用的对象。
在清除阶段,GC会遍历整个堆,清除所有未被标记的对象。
2. 复制算法复制算法是针对标记-清除算法的改进。
它将堆分为两个区域,每次只使用其中一个区域。
当一个区域的对象被标记后,将其复制到另一个区域中,然后清除原来的区域。
这样可以解决碎片问题,但是需要额外的空间来存储复制的对象。
3. 标记-整理算法标记-整理算法是对标记-清除算法的改进。
它的过程与标记-清除算法类似,但是在清除阶段,标记-整理算法会将存活的对象向一端移动,然后清除边界外的所有对象。
这样可以解决碎片问题,并且不需要额外的空间。
4. 分代算法分代算法是针对对象的生命周期不同而提出的。
一般来说,对象的生命周期可以分为年轻代和老年代。
年轻代中的对象生命周期较短,老年代中的对象生命周期较长。
分代算法将堆分为年轻代和老年代两个区域,分别采用不同的垃圾回收算法。
年轻代一般使用复制算法,老年代一般使用标记-清除算法或标记-整理算法。
三、GC的执行过程1. 初始标记初始标记阶段是GC的第一步,它的目的是标记出所有的根对象,并且停止所有的应用线程。
这个过程是短暂的,因为只需要标记出与根对象直接关联的对象。
2. 并发标记并发标记阶段是GC的核心步骤,它的目的是通过并发执行来标记出所有的存活对象。
在这个阶段,GC会遍历整个堆,标记出与根对象直接或间接关联的存活对象。
深入分析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(Java虚拟机)是Java程序的运行环境,它负责将Java源代码编译成可执行的字节码,并提供运行时环境来执行字节码。
JVM的工作原理涉及到类加载、内存管理、垃圾回收、即时编译等多个方面。
1. 类加载JVM通过类加载器(ClassLoader)来加载Java类。
类加载器根据类的全限定名(包括包名和类名)在类路径中查找对应的字节码文件,并将其加载到内存中。
类加载器采用双亲委派模型,即先由父类加载器尝试加载类,如果父类加载器无法加载,则由子类加载器尝试加载。
这种模型保证了类的唯一性和安全性。
2. 内存管理JVM将内存分为多个区域,包括方法区、堆、栈和程序计数器。
方法区存储类的元数据信息,如字段、方法、常量池等。
堆是存放对象实例的区域,通过垃圾回收机制来管理内存的分配和释放。
栈用于存储方法的局部变量和方法调用信息。
程序计数器用于指示当前线程执行的字节码指令。
3. 垃圾回收JVM通过垃圾回收机制自动回收不再使用的对象内存。
垃圾回收器会定期扫描堆内存,标记所有还在使用的对象,然后清理掉未被标记的对象。
常见的垃圾回收算法有标记-清除、复制、标记-整理等。
JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS、G1等,可以根据应用场景选择合适的垃圾回收器。
4. 即时编译JVM使用即时编译器(Just-In-Time Compiler)将热点代码(经常被执行的代码)编译成本地机器码,以提高执行效率。
JVM会监测程序的运行情况,根据热点代码的执行频率和调用关系进行优化编译。
即时编译器可以选择不同的编译策略,如解释执行、编译执行或混合执行。
5. 内存模型JVM定义了Java程序在多线程环境下的内存模型,保证多线程的内存可见性和有序性。
内存模型规定了线程之间如何进行通信和同步。
JVM使用主内存和工作内存的概念,线程之间的共享变量存储在主内存中,每个线程有自己的工作内存,线程对共享变量的操作先在工作内存中进行,然后通过主内存来同步和通信。
面试谈jvm原理Java虚拟机(JVM)是Java语言运行的基础。
JVM具有封装性、跨平台性、高度优化和可扩展性等特点,是Java应用程序的核心。
在Java的诞生初期,由于硬件环境和操作系统制约,JVM起到了垫底的作用。
而今天,JVM已经成为Java 运行效率和安全性的保障。
下面是一些我认为JVM原理面试时可能会涉及的重点:1. JVM的内存模型:JVM将内存分为堆内存和栈内存,堆内存用于存储对象实例和数组,而栈内存则用于存储方法的执行状态。
同时,JVM还有方法区和永久代的概念。
这些内存区域的大小和分配情况会影响JVM的性能和稳定性。
2. 垃圾回收机制:JVM的内存管理包括垃圾回收机制和内存分配机制。
垃圾回收机制是JVM实现自动内存管理的核心,JVM会周期性地扫描堆内存中没有被引用的对象,并自动回收它们所占用的内存。
垃圾回收机制常用的算法包括标记清除、复制和标记整理等。
3. 类加载机制:Java程序在运行时,需要将类文件中的二进制数据加载到JVM 中,才能执行相应的操作。
类加载机制将类文件加载到JVM中,并将它们解析为Java类。
类加载机制包括三个阶段:加载、链接和初始化。
4. JIT编译器:JIT(Just In Time)编译器是JVM在运行时动态优化的关键组件。
JIT编译器可以在程序运行时,根据代码的执行情况,生成本地机器代码,以提高程序的效率。
5. JVM调优:JVM的性能和稳定性很大程度上取决于JVM参数的设置和调整。
面试时,可能会涉及到如何根据系统的特点和需求,设置JVM参数以达到最佳性能和稳定性的问题。
总之,有关JVM原理的面试问题,往往涉及到JVM的内存模型、垃圾回收机制、类加载机制、JIT编译器和JVM调优等方面。
需要候选人对这些方面有比较深入的了解。
垃圾回收机制垃圾回收是计算机科学中一种重要的机制,用于回收和释放程序中不再使用的内存空间,以提高系统的效率和性能。
1. 什么是垃圾回收机制?垃圾回收是一种自动化的内存管理技术,用于检测和回收程序中不再可用的内存对象。
它可以分析程序的运行时行为,识别不再被引用的对象,并将其释放以供其他程序使用。
2. 垃圾回收的优点- 减少内存泄漏:垃圾回收可以识别并回收不再使用的内存对象,从而减少内存泄漏的风险。
- 提高性能:回收不再使用的内存可以释放系统资源,提高程序的运行效率和响应速度。
- 简化编程:垃圾回收可以减少程序员手动管理内存的工作量,使编程更加简单和可靠。
3. 垃圾回收的实现方式垃圾回收机制可以通过以下几种方式来实现:- 引用计数:每个对象都维护一个引用计数器,当引用计数为零时,认为对象不再需要,可以进行回收。
- 标记-清除:通过标记所有可达对象,然后清除不可达对象来进行回收。
- 复制式垃圾回收:将内存分为两个区域,一部分为活跃对象,另一部分为闲置对象。
当活跃对象占满时,将活跃对象复制到闲置对象区域,然后清除活跃对象的内存。
- 分代式垃圾回收:根据对象的存活时间将内存分为多个代,然后对不同代进行不同的垃圾回收策略。
4. 垃圾回收的挑战垃圾回收虽然带来了许多优点,但也面临一些挑战:- 停顿时间:垃圾回收会导致程序的停顿,影响系统的实时性能。
- 资源消耗:垃圾回收需要消耗系统的资源,包括CPU和内存。
- 确定回收时机:确定内存对象是否不再使用是一个复杂的问题,需要进行准确的分析和判断。
5. 垃圾回收的最佳实践为了充分利用垃圾回收机制,以下是一些最佳实践:- 避免创建不必要的对象:尽量避免频繁创建和销毁对象,以减少垃圾的产生。
- 及时释放资源:在不再需要使用内存对象时,及时进行释放,以加快垃圾回收的速度。
- 使用合适的数据结构:选择合适的数据结构可以减少垃圾回收的复杂性和开销。
结论垃圾回收机制是一种重要的内存管理技术,可以提高系统的性能和可靠性。
垃圾回收机制的原理随着计算机领域的不断发展,我们的应用程序正在变得越来越庞大和复杂。
而这些应用程序一旦开始运行,就会占用大量的系统内存。
为了确保计算机系统的稳定运行,我们需要一种垃圾回收机制来确保内存资源的有效管理。
本文将介绍垃圾回收机制的原理以及其在计算机系统中的应用。
1. 垃圾回收机制垃圾回收机制是一种自动内存管理机制,它会扫描内存中不再使用的对象并将其标记为“无用垃圾”。
这些“无用垃圾”对象然后被系统回收,以释放它们占用的内存资源。
在某些编程语言中,如Java和Python,垃圾回收机制是自动完成的,开发人员不需要手动清理内存。
在其他编程语言中,如C和C ++,开发人员需要手动释放不再使用的内存资源。
2. 垃圾回收算法垃圾回收算法是垃圾回收机制的核心。
垃圾回收算法通常使用两种基本方法: 引用计数和标记-清除。
2.1 引用计数引用计数算法是最简单的垃圾回收算法之一。
在这个算法中,编程语言会保持即将使用的每个对象的引用数量。
当引用数量降至零时,对象将被标记为垃圾并由垃圾回收机制自动回收。
尽管这种算法可能比较简单,但它容易陷入循环引用的问题,即两个或多个对象引用对方,而不消失引用。
因此,循环引用的对象不会被回收,这可能会导致内存泄漏。
2.2 标记-清除标记-清除算法是一种更复杂的垃圾回收算法,它由两个步骤组成。
首先,算法扫描内存中的所有对象,标记所有活动对象。
这些活动对象在程序中仍有引用。
然后,算法会清空未标记的对象,释放它们占用的内存资源。
这种算法能够解决引用计数的问题,但在大型内存中,扫描整个内存可能比较缓慢,影响系统的性能。
3. 垃圾回收机制的应用场景在大型应用程序中,使用垃圾回收机制来确保有效的内存管理非常重要。
垃圾回收机制能够避免内存泄漏等问题,保证系统的稳定运行。
垃圾回收机制的典型应用场景包括桌面应用程序和网络应用程序,如网站和服务器。
4. 总结垃圾回收机制是一种自动化的内存管理机制,它可以扫描内存中无用的对象,并释放它们占用的内存资源。
JVM垃圾回收算法及G1回收机制JVM(Java Virtual Machine)是Java程序运行的环境,其中的垃圾回收算法是JVM内存管理的重要组成部分。
垃圾回收算法的作用是自动释放不再使用的内存空间,以提高程序的性能和效率。
其中,G1(Garbage-First)是一种现代化的垃圾回收器,相较于传统的垃圾回收算法具有更高的效率和更低的延迟。
垃圾回收算法的核心思想是通过扫描内存,找出不再被引用的对象,并将其释放。
常见的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法等。
标记-清除算法是最基础的垃圾回收算法之一、它通过标记所有被引用的对象,然后清除未被标记的对象。
这个算法的优点是可以处理任意的内存分配情况,但是会产生大量的碎片化空间。
复制算法是另一种常见的垃圾回收算法。
它将内存分为两个区域,每次只使用其中一个区域。
当一个区域满了之后,将还存活的对象复制到另一个区域,然后清除当前区域。
这个算法的优点是简单高效,但是会浪费一半的内存空间。
标记-整理算法是标记-清除算法的改进版。
它先标记所有被引用的对象,然后将存活的对象向一端移动,然后清除边界之外的对象。
这个算法的优点是可以减少碎片化空间,但是会有对象移动的开销。
G1是一种基于标记-整理算法的垃圾回收器,它在Java SE 6u14版本中引入。
G1回收机制主要有以下几个特点:首先,G1将堆内存划分为若干个大小相等的区域(Region),每个区域可以是Eden区、Survivor区或Old区。
这种划分方式可以有效地减少碎片化问题,并且可以根据实际情况动态调整区域的大小。
其次,G1采用了增量式的标记算法,在应用程序运行的同时进行垃圾回收操作。
这样可以减少单次垃圾回收的暂停时间,并且将垃圾回收的工作均匀地分布在多个时间片段中,避免长时间的停顿。
再次,G1使用了全局的标记-整理算法。
它通过标记所有被引用的对象,然后将存活的对象向一端移动,并清除边界之外的对象。
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(Java虚拟机)是一种运行Java字节码的虚拟机,它是Java 语言的核心组成部分。
JVM的主要工作是将Java代码编译成字节码并在运行时执行这些字节码。
JVM的工作流程如下:
1. 读取字节码:JVM读取字节码文件并将其加载到内存中。
2. 类加载:JVM将字节码文件转换为Java类,并进行类的验证、准备和解析。
3. 内存分配:JVM为Java类分配内存空间,并将其属性和方法加载到内存中。
4. 字节码执行:JVM执行Java字节码,通过解释器或即时编译器将字节码转换为机器码,并在CPU上运行。
5. 垃圾回收:JVM负责管理Java对象的内存分配和释放,使用垃圾回收算法来自动回收不再使用的对象。
JVM的工作原理是基于Java语言的跨平台特性,它将Java代码转换为字节码,使得Java程序可以在不同的操作系统和硬件上运行。
同时,JVM的垃圾回收机制可以有效地管理内存,避免了内存泄漏和越界访问等问题,提高了Java程序的稳定性和安全性。
- 1 -。
JVM内存垃圾回收⽅法概要:why:为什么回收,见whatwhat:垃圾回收哪些内存(不可达对象的确定)when:何时执⾏GC(安全点、安全区域)how:如何回收(原理——垃圾回收算法、实现——垃圾收集器)1、垃圾回收哪些内存JVM运⾏时数据区中,线程私有的程序计数器、虚拟机栈、本地⽅法栈随线程的创建和退出⽽⾃动产⽣和销毁,不需要垃圾回收;⽽对于⽅法区和堆区,由于是随虚拟机的启动和退出⽽创建和销毁,在这期间被各线程共享,若不回收垃圾以腾出空间则最终会耗尽这两部分空间。
因此,JVM垃圾回收的是共享区域的内存,主要是⽅法区和Java堆内存的回收。
1.1、⽅法区⽅法区的垃圾收集主要是回收废弃常量和⽆⽤的类(卸载类)。
回收废弃常量与下⾯将介绍的回收Java堆中的对象很相似,⽽判定“⽆⽤的类”需同时满⾜三个条件:1、该类所有实例已被回收,即Java堆中⽆该类的任何实例。
(下层)2、该类对应的ng.Class对象没有在任何地⽅被引⽤,⽆在任何地⽅通过反射访问该类的⽅法。
(下层)3、加载该类的ClassLoader已被回收。
(上层)java 8提供了-xx:MetaspaceSize来设置触发元空间垃圾回收的阈值。
1.2、堆Java堆⾥⾯存放着⼏乎所有的对象实例,垃圾收集器对堆进⾏回收前,⾸先要做的就是确定哪些对象可以作为垃圾回收。
JDK1.2后,Java对引⽤概念进⾏了扩充,将引⽤分为强引⽤(Strong Reference)、软引⽤(Soft Reference)、弱引⽤(Weak Reference)、虚引⽤(Phantom Reference)、终引⽤(Final Reference)。
关于Java Reference,可参阅。
总的来说,回收的堆对象有两类:1、有被引⽤的对象:即被软引⽤、弱引⽤、虚引⽤所引⽤的对象可能被JVM强制当成垃圾回收。
1、软引⽤:软引⽤对象在系统将要发⽣内存耗尽(OOM)前会被回收。
JVM内存管理和垃圾回收Java虚拟机的一个强大之处在于其提供垃圾自动回收,对开发人员掩盖了内存分配和回收的细节。
本篇将探索JVM的内存分配和垃圾回收机制,以在内存分析实战中提供一些理论和实践参考。
1.从理论开始1.1.垃圾检测任何虚拟机的回收算法都包括两个步骤:检测垃圾和回收垃圾。
当一个对象被创建时,其是活动的对象,此时其是可用的,而在运行过程中,该对象的引用不再被使用,这时该对象就成为垃圾,一般采用两种方式来区别活动对象和垃圾对象:引用计数和跟踪。
当一个对象被其它对象引用时,其引用计数加1,当不再被其它对象引用时,计数减1,当其引用计数为0时,该对象就成为垃圾,引用计数的缺点是无法检测循环引用和维护引用计数的代价,在现代虚拟机中一般不采用该方式。
而跟踪指的是虚拟机追踪从根对象出发的有向对象图,如果一个对象不能被追踪到,则该对象为垃圾,采用追踪算法的垃圾回收器也叫标记并回收回收器(见下图,可以形象地理解为在堆空间中引入了重力场,参见/art/200610/32793.htm)。
图1 初始状态图2 TR1-A链和TR2-D链断开,A、B、C、D掉入回收池图3 A、B、C、D四个对象被回收1.2.避免堆碎片在进行垃圾回收之后,由于内存分配时,垃圾对象和活动对象可能相邻存在,则可能会在堆中出现堆碎片,采用标记并回收回收器的虚拟机一般采用两种方法来对付堆碎片:压缩和拷贝。
压缩回收是指当进行垃圾回收之后,将剩下的活动对象推向堆的另一端,则当垃圾回收完毕之后在另一端形成连续的堆。
拷贝回收指的是保持两个同样大小的堆,在对一个队进行垃圾回收过程中,对于检测出来的活动对象拷贝到另一个堆并连续存放。
参见下图图4 拷贝收集和压缩手集1.3.分代回收拷贝回收的一个缺点在于有些对象是长期存在的,但在回收过程中仍然必须将这些对象多次拷贝,分代回收指的是,对不同年龄(在内存存在的时间的长短)将对象放入不同的代堆中,并对不同的代堆采用不同的回收算法。
事实上,大部分的对象属于“短命”对象,我们可以更多地对年轻的代堆进行垃圾回收,而对于年老的代堆则减少回收频度。
1.4.垃圾回收器设计决策顺序执行垃圾回收VS并行垃圾回收:在顺序执行垃圾回收器中,即使系统拥有多个处理器,也只有一个处理器会执行垃圾回收,相比之下,并行垃圾回收具备更好的垃圾回收性能,但因此必定引入更多的复杂性和潜在的内存碎片。
并发执行VS停止并回收:停止并回收指在进行垃圾回收时停止应用线程的执行,而并发执行垃圾回收器在大部分情况下与应用线程并发执行,当然,部分操作仍然需要在停止应用线程的情况下执行,并发回收对应用线程的停止时间更短,但相比而言,并发执行垃圾回收器将占用更多的空间并有可能对系统性能产生影响。
压缩VS不压缩VS拷贝:随着对象的消亡,JVM的堆空间将不可避免地存在碎片:一种方式是对碎片进行压缩,付出的代价是垃圾回收时更多的操作,得到的好处是能够快速分配;一种方式是不进行压缩,好处是垃圾回收更快,但分配算法将更加复杂;另外一种是拷贝,即将存活的对象拷贝到一个新的空间段上,之后将旧的对象全部销毁,好处是垃圾回收快,内存分配快,但必须付出更多的空间代价。
1.5.性能度量吞吐量(Throughput):吞吐量 = (总执行时间-垃圾回收时间)/总执行时间暂停时间(Pause time):垃圾回收导致的应用的暂停时间2.Sun HotSpot JVM实战2.1.JVM分代垃圾回收JVM的堆空间分成年轻代(Young Gen)、年老代(Old Gen)和持久代(Perm Gen),其中年轻代用于放置新创建的对象,而对象在经过几次的垃圾回收后仍然没有被回收,则将其转移到年老代,持久代用于放置一些为JVM本身的方便性而使用的对象,譬如类定义、方法定义、常量、代码段等。
年轻代又分为一个Eden 区和两个Survivor区, 而总有一个Survivor区是空的,随着每一次的垃圾回收,从Eden区和非空Survivor区的存活对象拷贝到空Survior区,如果Survior 空间不足,则直接拷贝到年老区中,并将刚经历过回收的区空间返回到堆空间,此时两个Survivor的角色做了个转换(空的变成非空,非空的变成空的)。
当一个对象经过多次回收仍然存在,则将其转入年老区。
Sun HotSpot JVM对不同代将使用不同的垃圾回收算法。
图5 Sun HotSpot VM堆分代2.2.内存分配对于大块的连续内存,使用bump-the-pointer技术,内存分配将非常简易和快速。
对于多线程的场景,情况稍微复杂,内存分配必须是线程安全的,这可能导致内存分成为系统的瓶颈。
Sun HotSpot JVM使用所谓的Thread-Local Allocation Buffers (TLABs)技术来解决这个问题,通过指定给每个线程一定的Buffer空间,线程在内存分配时,将尽量从此空间上分配,由于空间是独享的,因此分配将非常地快速,当然相应的,可能会造成空间的浪费。
2.3.不同垃圾回收器比较2.3.1.垃圾回收方式2.3.2应用场景Serial Collector:适用于客户端应用程序,并且对暂停时间要求不严格,能够有效地管理64M左右的内存,垃圾回收导致的暂停时间在半秒内Parallel Collector:适用于多处理器的服务器,并且对暂停时间要求不严格,譬如批处理等ParallelCompacting Collector:适用于多处理器的服务器,并且对暂停时间稍微严格的应用Concurrent Mark-Sweep (CMS) Collector:适用于多处理器的服务器,并且对暂停时间非常严格的应用2.3.3.Sun HotSpot JVM参数自动调整2.3.3.1.server和client模式除了32位的windows系统,只要服务器拥有2+个处理器单元和2G+的系统内存,虚拟机自动识别为server模式,否则为client模式 可以通过在启动参数中指定-server或者-client来指定使用的模式Client模式默认使用serial garbage collector,初始4M、最多64M 的堆内存Server模式默认使用parallel collector,初始1/64的物理内存最多不超过1G、最多1/4的物理内存最多不超过1G可以通过指定特定的参数来覆盖默认的参数2.3.3.2.Parallel Collector根据设定的目标自动调整指定暂停时间目标:通过指定-XX:MaxGCPauseMillis=n启动参数来设定最大的暂停时间目标,单位为毫秒,虚拟机自动根据该目标来调整各个代空间的大小,当然,有时会也会无法达到目标,另外,该参数可能会降低系统的吞吐量。
默认情况下,虚拟机不指定暂停时间。
指定吞吐量目标:通过指定-XX:GCTimeRatio=n 启动参数来设置最低的吞吐量目标,其中,n = 1 / (1-吞吐量) – 1,譬如预定的吞吐量为95%,则n = 1 / 5% - 1 = 19,虚拟机自动根据该目标自动调整各个代空间的大小,注意,该参数可能会加到垃圾回收导致的暂停时间。
虚拟机默认目标吞吐量是99%。
2.4.常用的Sun HotSpot JVM启动参数2.4.1.指定垃圾回收器–XX:+UseSerialGC:使用Serial Collector–XX:+UseParallelGC:使用Parallel Collector–XX:+UseParallelOldGC:使用ParallelCompacting Collector(JDK6+) –XX:+UseConcMarkSweepGC:使用Concurrent Mark-Sweep (CMS) Collector2.4.2.Parallel and Parallel Compacting Collectors参数–XX:ParallelGCThreads=n(默认为处理器数):并发垃圾回收线程数 –XX:MaxGCPauseMillis=n和–XX:GCTimeRatio=n:见2.4.2说明2.4.3.CMS Collector参数–XX:+CMSIncrementalMode(默认为disable):启用垃圾回收增量模式,该模式可降低因垃圾回收导致的暂停时间–XX:ParallelGCThreads=n(默认为处理器数):并发垃圾回收线程数 –XX:+CMSIncrementalPacing(默认为disable):与上一个参数配合使用,根据应用程序的行为自动调整每次执行的垃圾回收任务的幅度(或比例?)(原文:Enables automatic control of the amount of work the CMS collector is allowed to do before giving up the processor, based on application behavior.)-XX:CMSIncrementalDutyCycle=<N> (default: 5):每次增量回收垃圾的占总垃圾回收任务的比例,如果参数CMSIncrementalPacing指定,则指的是初始比例。
(原文:This is the percentage (0-100) of timebetween minor collections that the concurrent collector is allowed to run. If CMSIncrementalPacing is enabled, then this is just the initial value.)-XX:CMSIncrementalDutyCycleMin=<N> (default: 10):与CMSIncrementalPacing参数配合使用,每次增量回收垃圾的占总垃圾回收任务的最小比例(原文:This is the percentage (0-100) which is the lower bound on the duty cycle when CMSIncrementalPacing isenabled.)2.4.4.垃圾回收统计(系统剖析和性能调优使用)–XX:+PrintGC:打印每次垃圾回收的基本信息–XX:+PrintGCDetails:打印每次垃圾回收的详细信息–XX:+PrintGCTimeStamps:在每次垃圾回收时打印时间,与上两个参数之一结合使用2.4.5.堆空间和代空间设置–Xmsn:初始堆空间,譬如-Xms512M–Xmxn:最大堆空间,譬如-Xmx1024M,一般可指定这两个参数一致以避免在系统运行期间进行堆空间的调整–XX:MinHeapFreeRatio=minimum(默认40):当代空闲空间在代空间中比例大于maximum时,自动减少代空间以小于该值–XX:MaxHeapFreeRatio=maximum(默认70):当代空闲在代空间中比例小于minimum时,自动增长代空间以大于该值–XX:NewSize=n:默认年轻代空间的大小,譬如–XX:NewSize=400M –XX:NewRatio=n(默认server模式是8,client模式是2):年轻代空间与年老代空间的比例–XX:SurvivorRatio=n(默认是32):Eden区与Survivor区的比例,譬如–XX:SurvivorRatio=7,则每个Survivor区占整个年轻代空间的1/9(注意,有两个Survivor区)–XX:MaxPermSize=n:持久区大小,譬如–XX:MaxPermSize=128M 3.装备我们的工具箱3.1.内存剖析(jmap+jhat)3.1.1.命令Jps:与ps命令类似,显示java进程的进程号Jmap: 统计当前虚拟机的堆内存数据,一般使用如下:jmap –dump:file=filename {pid},将统计数据dump到filename文件中 Jhat(Java Heap Analysis Tool):将上一个命令的统计数据文件分析后以html的方式展现,一般使用如下:jhat –J-mx512M filename 3.1.2.常用的统计数据在jhat程序运行后,访问http://{server}:7000查看统计数据3.1.2.1.每个类的实例数(按实例数从多到少排序)图7 类实例数统计截图3.1.2.2.每个类的实例数和占用空间数(按占用空间数从大到小排序)图8 类实例占用空间统计截图3.1.2.3.每个类的引用统计(如下是String被其它类的实例引用的次数统计,按引用次数从多到少排序)图9 类ng.String引用截图案3.2.虚拟机监控(jconsole)/j2se/1.5.0/docs/guide/management/jconsole.htm l3.3.综合剖析工具(jprofiler)Jprofiler是一个功能非常强大的性能剖析工具,但其对系统的性能影响非常之大,一般只能用于测试环境的性能剖析,特别是执行时间统计剖析。