`
flyPig
  • 浏览: 139594 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JavaGC知识整理

    博客分类:
  • Java
阅读更多

JVM管理的内存叫堆。在32Bit操作系统上有1.5G-2G的限制,而64Bit,我可以设到64G,再往上就没试过了。
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64。
JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。

默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。
默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以由-XX:MaxHeapFreeRatio=指定。
服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小,所以上面的两个参数没啥用。

基本收集算法
   复制:将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。
      因为只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,但需要巨大的复制成本和较多的内存。

   标记清除:收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。该算法遍历整个空间的成本较大暂停时间随空间大小线性增大,而且整理后堆里的碎片很多。

   标记整理:综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。

什么是分代
    根据对象的生命周期长短,把堆分为3个代:年青代、年老代、持久代,根据各自的特点分别采用合适的回收算法。

    年轻代:这类对象都是随生随灭的。因此所有收集器都为年轻代选择了复制算法。
    复制算法优点是只访问活跃对象,缺点是复制成本高。因为年轻代只有少量的对象能熬到垃圾收集,因此只需少量的复制成本。而且复制收集器只访问活跃对象,对那些占了最大比率的死对象视而不见,充分发挥了它遍历空间成本低的优点。

    Young的默认值为4M,随堆内存增大,约为1/15,JVM会根据情况动态管理其大小变化。
    -XX:NewRatio= 参数可以设置Young与Old的大小比例,-server时默认为1:2,但实际上young启动时远低于这个比率。如果信不过JVM,也可以用-Xmn硬性规定其大小,有文档推荐设为Heap总大小的1/4。

    Young里面又分为3个区域,一个Eden,所有新建对象都会存在于该区,两个Survivor区,用来实施复制算法。每次复制就是将Eden和第一块 Survior的活对象复制到第2块,然后清空Eden与第一块Survior。Eden与Survivor的比例由 -XX:SurvivorRatio=设置,默认为32。Survivio大了会浪费,小了的话,会使一些年轻对象潜逃到老人区,引起老人区的不安,但这个参数对性能并不重要。
   
    年老代:年轻代的对象如果能够挺过数次收集,就会进入老人区。老人区使用标记整理算法。因为老人区的对象都没那么容易死的,采用复制算法就要反复的复制对象,很不合算,只好采用标记清理算法,但标记清理算法其实也不轻松,每次都要遍历区域内所有对象。-XX:MaxTenuringThreshold=设置熬过年轻代多少次收集后移入老人区,熬过第一次GC就转入,可以用-XX:+PrintTenuringDistribution查看。
   
    持久代:装载Class信息等基础数据,默认64M,如果是类很多很多的服务程序,需要加大其设置 -XX:MaxPermSize=,否则它满了之后会引起fullgc()或Out of Memory。Spring,Hibernate这类喜欢AOP动态生成类的框架需要更多的持久代内存。
分享到:
评论

相关推荐

    JAVA核心知识整理.pdf

    ### JAVA核心知识整理 ...以上内容覆盖了JAVA核心知识整理中的关键知识点,包括JVM的基础知识、垃圾回收机制、引用类型、GC垃圾收集器的选择、IO/NIO模型及其实现、类加载机制以及常见的集合类等。

    Java核心知识整理.pdf

    Java核心知识整理 Java是一种广泛使用的面向对象编程语言,它具有跨平台、对象导向、简单易学等特点。作为Java工程师,需要掌握Java的多方面知识点,包括但不限于JVM(Java虚拟机)原理、Java内存模型、垃圾回收...

    JAVA核心面试知识整理.pdf

    Java核心面试知识整理包括了对JVM内存区域、垃圾回收机制、GC算法、JVM类加载机制、Java集合框架以及Java IO/NIO等多个方面的深入讲解。以下是对这些知识点的详细介绍: JVM内存区域:JVM内存区域包括了程序计数器...

    JAVA核心面试知识点整理

    JAVA核心面试知识点整理 Java是目前企业开发中最常用的编程语言之一,Java面试知识点涵盖了Java语言的方方面面,包括Java基础知识、Java高级知识、Java设计模式、Java框架等等。以下是Java核心面试知识点的整理。 ...

    JAVA核心面试知识整理-最全.zip

    这份“JAVA核心面试知识整理-最全.zip”压缩包提供了全面的Java面试准备材料,涵盖了Java基础、Java虚拟机(JVM)、多线程并发以及算法和Java中间件等多个关键领域。 首先,让我们深入Java基础。这部分通常包括Java...

    JAVA核心知识点整理.pdf

    根据提供的文件内容,我们可以整理出以下关于JAVA核心知识点的信息: ### 1. JVM内存区域 - **程序计数器**:它是线程私有的区域,用于记录线程执行的字节码指令地址。当线程进行切换时,程序计数器可以记录下线程...

    JAVA架构知识库整理 JAVA架构知识 Java架构师 Java 架构师必备

    MinorGC 的过程(复制->清空->互换)1: eden, servicorFrom 制到 ServicorTo, 年龄+1..2:清空eden, servicorFrom..3: ServicorTo 和 ServicorFrom互换,2.3.2. 老年代.2.3.3. 永久代2.3.3.1. JAVA8 与元数据.2.4. 垃圾...

    JAVA核心面试知识整理

    标题《JAVA核心面试知识整理》指出了整理的内容主要是Java基础知识,对于面试来说,这些基础知识点是必考的核心,掌握这些知识对求职者至关重要。描述中提到“搞懂这些,最起码不会饿死”,暗示这些知识点是Java编程...

    JAVA核心面试知识整理【书签完整】【高清可复制】

    这份"JAVA核心面试知识整理"的资源涵盖了广泛的Java技术栈,是准备Java面试或者深化技术理解的宝贵资料。以下是对其中主要知识点的详细说明: 1. **JVM(Java虚拟机)**:JVM是Java程序运行的基础,它负责解析....

    java学习笔记,java基础知识整理

    ### Java学习笔记——Java基础知识整理 #### 一、Java技术入门 Java是一种广泛使用的编程语言,因其跨平台性、安全性和高效性而受到青睐。Java最初由Sun Microsystems开发,并于1995年首次发布。 ##### 1. Sun ...

    JAVA核心知识点整理_分享.pdf

    这份"JAVA核心知识点整理_分享.pdf"文档涵盖了Java技术体系的关键点,包括JVM(Java虚拟机)的深入理解,这对于任何Java开发者来说都是至关重要的。以下是根据文档内容整理的一些核心知识点: ### JVM(Java ...

Global site tag (gtag.js) - Google Analytics