GC:
gc不仅负责垃圾回收,还决定内存分配。
java内存管理主要是对内存中的对象进行内存的分配和回收,我们都知道当我们创建一个对象时,对象的引用放在栈(Stack)中,对象放在堆(heap)中,gc只回收堆里面的对象。当gc检测到一个堆中的一个对象不在被引用时,就会对这个对象进行回收。
当我们创建一个对象时,gc就会监视这个对象的地址,大小以及状态。gc有特定的回收算法,通常使用有向图来记录管理堆中的对象,通过这种方式来确定那些对象正在被引用,那些已经不在被引用,当一个对象不在被引用时,gc就有权回收这个对象。当然可以使用System.gc();Runtime.getRuntime().gc();来显示调用gc。但是java规范不保证gc不一定立即回收。
gc可以使我们在开发时候不用考虑内存回收的事情了,可以防止内存泄漏。
垃圾收集的实现种类:
1. 引用计数:
一个A对象,如果有程序使用了这个引用对象,那么引用计数加1,当一个对象使用完毕之后引用计数减1,那么引用计数为0的时候,则可以回收。
他不能识别循环引用
2. 跟踪收集:
root set :当前正在执行的线程;全局或者静态变量;JVM Handles;JNDI Handles
从root set 开始扫描有引用的对象,如果某个对象不可以到达,则说明这个对象已经dead,GC可以对其回收。也就是说:如果A对象引用了B对象,那么虚拟机会记住这个引用路径,同时B对象引用了C对象,那么也会记录这个路径如果一个对象没有在路径图中,那么可以收集。
需要维护一张引用的全景图,增加了内存开销,和图的遍历开销。
3. 基于对象跟踪的分代增量收集:
基于对象跟踪:说明是由跟踪收集发展而来的,分代是指对堆进行了合理的划分,
增量收集:不是每一次全部收集,而是累积的增量收集。
Sun的JVM将整个堆分为三代:YoungGen(新生代),OldGen(年老代),和PermGen(持久区):
Minor GC:通常是指对新生代的回收。
Major GC:通常是指对年老代的回收。
Full GC:Major GC除并发gc外均需对整个堆进行扫描和回收。
复制拷贝算法:要拷贝大量数据,不会产生碎片。
标记算法:从引用根节点开始标记所有被引用的对象,把未被引用的对象清除。要遍历所有对象,会产生碎片。
young又分为eden,survivor1(from space ),survivor2(to sapce ).youngGen区里面的对象的生命周期比较短,gc对这些对象进行回收的时候采用复制拷贝算法。
eden 每当一个对象创建的时候分配的这个区域。当eden无法分配时,触发一次Minor gc。gc每次回收的时候都将eden区存活的对象和survivor1中的对象拷贝到survivor2中,eden和survivor1清空;当gc执行下次回收的时候将eden和survivor2中的对象拷贝到surivor1中,清空eden和survivor2。依次这样执行;经过数次回收将依然存活的对象复制到OldGen区。
OldGen当对象从年轻代晋升到老年代之前,会检测老年区的剩余空间是否大于要晋升对象的大小,如果小于则直接进行一次Full GC,以便让老年去腾出更多的空间,然后再进行Minor GC,把年轻代的对象复制到老年代;如果大于,则根据条件(HandlePromotionFailure设置)进行Minor GC 和 Full GC。
老年区采用标记算法,因为老年区对象的生命周期都是比较长的,采用拷贝算法要拷贝大量的数据。采用标记算法每次gc回收都要遍历所有的对象。
PermGen主要存放加载进来的类信息,包括方法,属性,常量池等,满了之后可能会引起out of memory 错误。
分享到:
相关推荐
### Java的垃圾收集器(GC)详解 #### 引言 垃圾收集器(Garbage Collector,简称GC)是Java语言的一项重要特性,它自动化管理内存,显著减轻了开发者手动管理内存负担,避免了常见的内存泄漏问题,提高了程序的...
GC垃圾收集器+GC垃圾收集算法,配合java虚拟机一起看,效果更佳,内容简洁,重要,应届小白面试必备技能
GC垃圾收集器在JVM中扮演了重要角色,它负责执行内存中的垃圾回收。常见的垃圾收集器包括Serial收集器、ParNew收集器、Parallel Scavenge收集器、SerialOld收集器、ParallelOld收集器、CMS收集器和G1收集器。每种...
4. **Java面试之乾坤大挪移**:可能指Java内存模型和垃圾回收机制。理解堆内存、栈内存、方法区的概念,以及GC(Garbage Collection)的工作原理,如分代收集、引用类型等,是考察程序员对内存管理深度理解的常见...
- **垃圾收集器**:介绍常用的垃圾收集器(如Serial Collector、Parallel Collector等)特点及选择依据。 #### 四、Java扩展 - **红黑树实现原理**:探讨红黑树的平衡特性及其应用场景。 - **NIO(New IO)**:...
垃圾回收的优化通常涉及到调整堆大小、设置新生代和老年代的比例、选择合适的垃圾收集器组合(如Serial、ParNew、Parallel Scavenge、CMS、G1等)以及使用并发模式、并行度、暂停时间目标等参数。理解这些概念和原理...
对于JVM,面试者需要理解堆内存、栈内存、方法区、本地方法栈的划分,以及GC的分代理论和不同垃圾收集器的工作方式。深入理解内存泄漏和性能调优也是面试中的高分项。 设计模式是软件工程的基石,面试中常出现的有...
这份"Java面试题以及答案收集"涵盖了13个部分,旨在帮助Java开发者准备面试,增强对Java的理解。 1. **Java基础** - **数据类型**:Java有两大类数据类型——基本数据类型和引用数据类型。了解它们的区别以及各自...
Java核心面试知识整理包括了对JVM内存区域、垃圾回收机制、GC算法、JVM类加载机制、Java集合框架以及Java IO/NIO等多个方面的深入讲解。以下是对这些知识点的详细介绍: JVM内存区域:JVM内存区域包括了程序计数器...
包括Java面试题目、多线程编程、通信编程、数据库查询、异常处理机制、事件机制、多形与继承、抽象类与接口、String与StringBuffer的区别、final、finally的区别、Collection和Collections的区别、GC(垃圾收集器)...
- **垃圾回收机制**:了解垃圾回收的基本原理,如可达性分析算法和垃圾收集器。 7. **IO流**: - **字节流与字符流**:掌握InputStream、OutputStream、Reader、Writer及其子类的使用。 - **缓冲流**:理解...
这份"JAVA面试题集"正是为此目的而准备的,它收集了来自各大公司的面试题及对应答案,帮助求职者在面试中表现出色。 面试题集通常涵盖了以下几个方面: 1. **基础知识**:这部分可能包括Java语言的基本语法,如...
在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制(Garbage Collection, GC)是面试和技术交流中经常提及的话题之一。尤其对于那些深入研究Java内存管理和性能优化的技术人员来说,理解垃圾回收的...
JVM(Java虚拟机)是Java平台的核心,理解其工作原理,比如类加载机制、内存模型(堆、栈、方法区、元空间等)、垃圾收集器(新生代、老年代、CMS、G1、ZGC等)以及性能调优技巧,是区分优秀开发者的关键。...
垃圾收集(GC)和内存管理也是面试的重点,需要了解不同类型的垃圾收集器和内存区域,如新生代、老年代、CMS、G1等。 JVM(Java虚拟机)优化是面试的高阶话题,包括类加载机制、JVM调优参数、性能监控工具(如...
- `finalize`:是Object类的一个方法,当垃圾收集器准备回收对象时会被调用,通常用于执行对象的清理工作,如关闭文件等。 2. **Anonymous Inner Class**: 匿名内部类可以继承其他类或实现接口。在Swing编程中,...
- **垃圾回收**:GC的工作原理,不同垃圾收集器的特点。 - **内存泄漏**:如何识别和避免内存泄漏。 6. **IO流** - **字节流和字符流**:它们的区别和应用场景。 - **缓冲流**:提高读写效率的原理。 - **对象...
了解各种垃圾收集器的特点、优势、劣势以及使用场景对于优化Java应用至关重要,特别是对于准备BAT(百度、阿里巴巴、腾讯)等大公司面试的求职者来说。 【JVM内存模型】 JVM的内存主要分为堆区和非堆区。堆区又...
6. **GC(垃圾收集器)** - GC负责自动内存管理,避免程序员手动管理内存导致的内存泄漏等问题。 - 调用`System.gc()`或`Runtime.getRuntime().gc()`可请求垃圾收集,但不保证立即执行。 7. **String对象创建** ...
在JVM方面,垃圾收集(GC)是自动内存管理的核心部分,主要包括对象存活判断、垃圾收集算法和垃圾收集器等。JVM使用了多种算法,如标记-清除、复制、标记-整理和分代收集等。常用的垃圾收集器有Serial、Parallel、...