Java千百问_07JVM架构(011)_java垃圾回收都有哪些方式

点击进入_更多_Java千百问

1、java垃圾回收都有哪些方式

所谓垃圾回收方式,是指JVM提供的几种不同的垃圾回收器,不同的垃圾回收器进行垃圾回收时采用不同的方式。当然,总体原则遵循java垃圾回收机制。

了解java内存模型看这里:java内存模型是什么样的

了解堆内存看这里:java堆内存是什么样的

了解java垃圾回收机制看这里:java垃圾回收机制是什么

每种方式都有自己的优势与劣势。我们编程的时候可以通过向JVM传递参数来选择垃圾回收器。不同的垃圾回收期有大的不同,可以为我们提供完全不同的应用程序性能,所以理解每种垃圾回收器,并且根据不同的应用选择进行正确的选择是非常重要的。

垃圾回收器主要有4种:串行垃圾回收器(Serial Garbage Collector)

、并行垃圾回收器(Parallel Garbage Collector)、并发标记扫描垃圾回收器(CMS Garbage Collector)、G1垃圾回收器(G1 Garbage Collector),具体如下:

串行垃圾回收器

串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

并行垃圾回收器

并行垃圾回收器是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,当执行垃圾回收的时候它也会冻结所有的应用程序线程。

并发标记扫描垃圾回收器

并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程:

  1. 当标记的引用对象在老生代;
  2. 在进行垃圾回收的时候,堆内存的数据被并发的改变。

相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们能够为了更好的程序性能分配更多的CPU,那么相比并发垃圾回收器,并发标记扫描垃圾回收器是更好的选择。

通过JVM参数XX:+USeParNewGC打开并发标记扫描垃圾回收器。

G1垃圾回收器

G1垃圾回收器将堆内存分割成不同的区域,并且并发的对其进行进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。

G1垃圾回收会优先选择第一块垃圾最多的区域,它适用于堆内存很大的情况。

通过JVM参数–XX:+UseG1GC使用G1垃圾回收器

在Java 8中,G1可以通过JVM参数-XX:+UseStringDeduplication删除重复的字符串,只保留一个char[]来优化堆内存。

2、如何选择不同的垃圾回收器

我们需要根据应用场景、硬件性能和吞吐量需求来决定使用哪一种垃圾回收器,通过JVM参数的配置来选择垃圾回收器:

-XX:+UseSerialGC:串行垃圾回收器

-XX:+UseParallelGC:并行垃圾回收器

-XX:+UseConcMarkSweepGC:并发标记扫描垃圾回收器

-XX:ParallelCMSThreads:并发标记扫描垃圾回收器 =为使用的线程数量

-XX:+UseG1GC:G1垃圾回收器

其他内存常见配置:

-Xms:初始化堆内存大小

-Xmx:堆内存最大值

-Xmn:新生代大小

-XX:PermSize:初始化永久代大小

-XX:MaxPermSize:永久代最大容量

配置JVM GC参数的实例:

java -Xmx1024m -Xms512m -Xmn256m -XX:PermSize=64m -XX:MaxPermSize=128m -XX:+UseSerialGC -jar java-application.jar

上述配置的含义是:

堆内存512-1024M,新生代256M,永久代64-128M,采用串行垃圾回收器执行java-application.jar。

时间: 2024-10-05 23:46:43

Java千百问_07JVM架构(011)_java垃圾回收都有哪些方式的相关文章

Java千百问_07JVM架构(008)_java垃圾回收机制是什么

点击进入_更多_Java千百问 1.如何判断垃圾对象 垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理.通常的编程语言都会用以下算法之一进行判断: 引用计数(ReferenceCounting)算法 这种方法比较简单直观,核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收. FlashPlayer/Python使用该算法,简单高效.但是,Java/C#并不采用该算法,因为该算法没有解决对象相互引用的问题,即:当两

Java千百问_07JVM架构(017)_jvm常见配置都有哪些

点击进入_更多_Java千百问 1.jvm常见配置都有哪些 了解jvm内存模型看这里:java内存模型是什么样的 了解jvm内存管理看这里:jvm是如何管理内存的 了解jvm垃圾回收机制看这里:java垃圾回收机制是什么 jvm配置非常多,按照不同类型划分,常常用来优化jvm内存(了解jvm内存优化看这里:java内存如何优化),常见配置如下: 了解垃圾回收器看这里:java垃圾回收都有哪些方式 堆设置 -Xms=n 初始堆大小. -Xmx=n 最大堆大小. -Xmn=n 新生代大小,该配置优先

Java千百问_07JVM架构(016)_java内存如何优化

点击进入_更多_Java千百问 1.java内存如何优化 了解jvm内存管理看这里:jvm是如何管理内存的 了解堆内存看这里:java堆内存是什么样的 java内存的优化主要是通过合理的控制GC来实现,主要原则: 1. 不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况(因为GC过后这个值是不会变化的). 2. 使用JDK提供的内存查看工具,比如JConsole和Java VisualVM. 3. 优化内存主要的目的是降低youngGC的频率.减少fullG

Java千百问_07JVM架构(013)_java什么情况会内存溢出

点击进入_更多_Java千百问 1.Java堆什么情况会溢出 所有对象的实例都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,如果程序使用的内存超过了堆最大内存(-Xmx),则会溢出Java heap space. 了解java内存模型看这里:java内存模型是什么样的 了解堆内存看这里:java堆内存是什么样的 了解java垃圾回收机制看这里:java垃圾回收机制是什么 实例: public class HeapOOM { static class OOMObject{} /** *

Java千百问_07JVM架构(001)_java内存模型是什么样的

点击进入_更多_Java千百问 1.什么是内存模型 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多.Java针对多种异构平台的独立性,使得多线程技术也具有了开拓性的一面. 我们有时候在Java开发中,对于同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型.那究竟什么是内存模型呢? 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存.从内存中取出变量这样的底层细节. Java

Java千百问_07JVM架构(006)_java堆和栈有什么区别

点击进入_更多_Java千百问 1.java堆和栈有什么区别 了解jvm内存管理看这里:jvm是如何管理内存的 在<jvm是如何管理内存的>这篇文章中,已经对PC寄存器(计数器 pc registers).方法区(method area).本地方法栈(native method stacks).栈(stacks).堆(heap)内存区域做了介绍,其中栈(stacks).堆(heap)是java内存管理中非常重要的两个部分,具体区别如下: 2.基本数据类型储存在栈中吗 基本数据类型由于长度固定,

Java千百问_07JVM架构(018)_如何监控jvm的运行情况

点击进入_更多_Java千百问 1.如何监控jvm的运行情况 了解jvm内存模型看这里:java内存模型是什么样的 了解jvm内存管理看这里:jvm是如何管理内存的 了解jvm垃圾回收机制看这里:java垃圾回收机制是什么 了解jvm内存优化看这里:java内存如何优化 我们通常使用Jdk工具来监控jvm的运行情况,当然目前有很多第三方产品是通过jdk提供的api来组织数据进行监控的.具体来说有如下监控软件: Jconsole jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回

Java千百问_07JVM架构(002)_jvm实例的结构是什么样的

点击进入_更多_Java千百问 1.jvm实例的结构是什么样的 在Java虚拟机规范中,一个虚拟机实例的行为主要组成部分为:子系统.内存区域.数据类型和指令. 这些组件描述了JVM内部的一个抽象结构.与其说这些组成部分的目的是进行JVM内部结构的一种支配,不如说是提供一种对外部行为的严格定义,该规范定义了这些抽象组成部分的相互作用,以及Java虚拟机执行所需要的行为. 了解jvm内存管理看这里:java内存模型是什么样的 下图描述了JVM实例的一个内部结构,其中主要包括主要的子系统.内存区域.

Java千百问_07JVM架构(012)_fullGC、minorGC、magorGC有什么区别

点击进入_更多_Java千百问 1.fullGC.minorGC.magorGC有什么区别 fullGC.minorGC.magorGC还有youngGC是Java垃圾处理机制(GC)的名词,区分这几个概念非常简单: 老生代进行一次垃圾清理,被称为fullGC或者magorGC. 新生代进行一次垃圾清理,被称为youngGC或者minorGC. 了解java垃圾回收机制看这里:java垃圾回收机制是什么 解释完毕,不过要提一下的是,我们在JVM优化过程中的一个原则就是: 降低youngGC的频率