- 浏览: 90518 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hairongtian:
我想问一下在GC中的gc roots是什么?教科书的看不懂,能 ...
JVM-GC实践总结(纠正并发线程数 转载)
由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略。本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素。
AD:
本文来自和你在一起的博客,原文标题为《JVM调优总结(五)-分代垃圾回收详述1》。文章总结了JVM垃圾回收策略为什么要分代,如何分代,以及垃圾回收的触发因素。
为什么要分代
分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。
在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连 接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比 如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。
试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象, 但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。因此,分代垃圾回收采用分治的思想,进行代的 划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。
如何分代
如图所示:
虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比 较大的。
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制 过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时 存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空 的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
持久代:
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如 Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=& lt;N>进行设置。
什么情况下触发垃圾回收
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。
Scavenge GC
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对 年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因 而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
Full GC
对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:
· 年老代(Tenured)被写满
· 持久代(Perm)被写满
· System.gc()被显示调用
·上一次GC之后Heap的各域分配策略动态变化
发表评论
-
JVM 运行时数据区(转)
2012-07-11 23:02 1059运行时数据区 java虚拟机定义了若干种程序运行时使用 ... -
图解JVM 内存分配
2012-07-10 23:57 12221.简介 现摘录一段Java5 ... -
JVM-GC实践总结(纠正并发线程数 转载)
2012-07-10 16:27 3547首先感谢阿宝同学的帮 ... -
深入Java虚拟机:JVM中的Stack和Heap
2012-07-10 14:26 1093在JVM中,内存分为两个部分,Stack(栈)和He ... -
Java虚拟机(JVM)中的内存设置详解(转载)
2012-07-09 17:13 1137在一些规模稍大的应用 ... -
JVM原理_内存篇(转载)
2012-07-09 16:56 2161一、JVM简介 ... -
JVM参数调优的八条经验(转载)
2012-07-09 14:35 956要想配置好JVM参数,需要对年轻代、年老代、救助空间和永久代有 ... -
Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12)
2012-06-30 11:45 1231使用Tomcat的童鞋们注意了。为了增加tomcat的性能和稳 ... -
Tomcat和Terracotta服务器将普通的Web应用部署到集群中,实现跨Tomcat节点的session复 制
2012-06-30 11:31 1353本文介绍如何配置Tomcat和Terracotta服务器将普通 ... -
tomcat session 持久化会话
2012-06-30 11:29 1602tomcat6 中关闭服务 会自动把session持久化 ... -
Tomcat集群Session丢失解决方案
2012-06-29 01:38 4407这几天单服务器整合项目很正常,集群的时候问题就来了,配 ... -
nginx+tomcat集群+session复制
2012-06-29 01:34 1240ulimit -SHn 65535 echo " ... -
linux下的并发数量
2012-06-26 21:32 968在部署系统后,为了增加系统并发量,系统响应速度,做了一些 ... -
网站的静态化处理
2012-06-26 21:10 874urlrewritefilter 下载: htt ... -
linux+nginx+tomcat负载均衡,实现session同步
2012-06-21 15:18 3898花了一个上午的时间研究nginx+tomcat的负载均衡测试, ... -
tomcat6_apache2.2_ajp负载均衡加集群实战 [转]
2012-04-26 16:07 936秀脱linux笔记之tomcat6_apa ... -
JVM内存最大能调多大分析-转帖
2012-02-18 12:48 1389JVM内存最大能调多大分析【经典】 上次用webl ... -
nginx for windows之负载均衡
2011-05-06 17:53 9641.编辑c:\nginx\conf\nginx.conf ... -
Tomcat6性能调优 出现java.lang.OutOfMemoryError: PermGen space
2010-08-03 13:51 1379Tomcat6在部署应用中,Server报错:java.lan ... -
APACHE 2.2.8+TOMCAT6.0.14配置负载均衡
2010-01-21 02:11 0目标: 使用 apache 和 tomcat ...
相关推荐
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收器(Garbage Collector, GC),以及内存分配策略。理解这些概念对于优化Java应用性能至关重要。本篇文章将深入探讨JVM的垃圾回收机制以及...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收(Garbage Collection,简称GC)。GC是JVM自动管理内存的主要方式,它负责识别并清理不再使用的对象,以避免内存泄漏和资源浪费。理解并...
**垃圾回收策略**: - **对象晋升策略**:大对象直接进入老年代,长期存活的小对象也会晋升。 - **垃圾收集器**:如Serial、ParNew、Parallel Scavenge、CMS、G1等,各有特点,适用于不同场景。 理解JVM内存模型和...
它与Parallel Old回收器搭配,用于老年代垃圾回收,两者都属于吞吐量优先的策略。 4. **CMS回收器**(Concurrent Mark Sweep):以低延迟为目标,尽量减少应用程序的暂停时间,通过并发地执行大部分垃圾回收任务。...
基于对象生命周期的特性,分代收集算法将对象按照生存周期的不同划分为不同的区域,并针对不同区域采用不同的垃圾回收策略。现代的垃圾回收器(从J2SE 1.2开始)通常采用这种算法。 - **年轻代**(Young Generation...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至...总结来说,理解JVM的内存管理与垃圾回收机制对于优化Java应用性能至关重要,开发者需要根据应用特点选择合适的垃圾回收策略和参数设置,以实现高效且稳定的运行。
JVM的垃圾回收策略通常是组合使用的,例如,并行GC与CMS配合,以实现高效且低延迟的垃圾回收。 理解JVM内存管理和垃圾回收机制对于优化Java应用的性能至关重要。开发者可以根据应用的需求和特点,通过调整JVM参数来...
此外,内存分配的速度和垃圾回收策略直接影响到JVM的性能指标,如吞吐量(应用程序的执行时间与总时间的比率)和暂停时间(垃圾回收导致的应用暂停的时长)。 总之,JVM内存管理和垃圾回收是优化Java应用性能的关键...
**JVM之垃圾回收器** Java虚拟机(JVM)是Java编程语言的核心组成部分,它负责执行字节码并管理程序运行时的内存。在JVM的内存模型中,垃圾回收(Garbage Collection, GC)是一项重要的功能,它自动识别并清理不再...
理解JVM垃圾回收机制对于优化Java应用性能至关重要。 1. **垃圾回收的基本概念** - **对象生命周期**:在Java中,对象的生命周期包括创建、使用和销毁。当对象不再被引用时,就被认为是“垃圾”。 - **垃圾回收器...
基于这一假设,JVM将堆内存划分为不同的区域,不同区域采用不同的垃圾回收策略。 - **新生代(Young Generation)**: 包含Eden区和两个Survivor区(S0和S1)。对象首先在Eden区分配,经过一次或多次垃圾回收后仍然...
分代收集算法是根据对象的生命周期将其分为年青代、年老代和持久代(或称为永久代),并针对不同代的对象使用不同的垃圾回收策略。这种算法在现代的垃圾回收器中都有所应用。 按照系统线程分,垃圾回收算法分为串行...
《JVM垃圾回收艺术——探索Tenured Generation的内涵》 在深入探讨JVM垃圾回收机制的艺术之前,我们先来理解一下“天才”的定义——一种对事业、对工作的极度热爱。JAVA垃圾回收(GC)同样展现出这种对效率和优化的...
开发者应该依赖JVM的默认垃圾回收策略,或者通过设置JVM参数来调整适合应用的垃圾回收策略,而不是频繁地手动触发垃圾回收。 总之,垃圾回收是Java程序内存管理的关键组成部分,JVM通过复杂的算法和策略来优化这一...
G1是JVM的一种分代垃圾收集器,引入了Region的概念,目标是预测并控制垃圾回收停顿时间。G1不仅在年轻代和老年代之间,还在Region内部进行垃圾回收,解决了CMS的内存碎片问题。G1采用了混合GC策略,可以在一次GC...
总之,JVM内存管理和垃圾回收是Java开发中的重要概念,理解其工作原理有助于编写高效、稳定的代码,并避免因内存问题导致的程序异常。通过不断优化和调整,开发者可以更好地掌控Java应用的性能。
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
为了监控和优化JVM的垃圾回收,开发者可以使用如VisualVM、JConsole、JMX等工具,通过观察内存分配、垃圾回收日志、GC停顿时间等指标来调整JVM参数,比如设置最大堆大小、年轻代和老年代的比例、GC算法选择、晋升...
Java虚拟机(JVM)是Java程序的核心,它负责管理程序的运行时环境,包括...通过调整JVM参数,优化垃圾回收策略,可以显著提升应用的性能和稳定性。对于Java程序员而言,深入理解这些概念和原理是提升技术水平的关键。