引言
java对象的实例都存放在堆里,有的对象会频繁的创建和消亡,生命周期短,而另外一些对象则相当长寿。jvm按照寿命的长短将对象存放于不同的堆区里并采用不同的垃圾回收策略,最大限度的保证内存的需求和降低gc的消耗。
堆的分区
堆分为三个代,分别是青年代(Young)、老年代(Old)和永久代(Perm)。
青年代(Young)
顾名思义,青年代用来存放新创建和年轻的对象,何为年轻?年轻到什么程度?这得由垃圾回收器说了算,如果经过几次(默认是15次)垃圾回收后对象依然存活,垃圾回收器就认为该对象不再年轻,于是就把该对象转移到老年代。另外,如果青年代得空间不足也会将部分青年代对象转移到老年代。
青年代又分为三个区:
创建空间(Eden)、生存空间0(Survivor)、生存空间1(Survivor1),分别简记为E、S0、S1
对象的创建都在E区完成,若E区空间不足,jvm执行minorGC,具体做法如下:
a、将E区中的存活对象复制到一个空的S区,另一个S区中的存活对象也复制到这个空的S区,始终保证一个S区是空的,清空E区;
b、a步骤中若发现S区满,将其中的对象复制到老年代(Old);若未满,其中一些足够老的对象也会复制到老年代(Old)。
c、b步骤中若老年代(Old)也满了,则执行全收集(fullGC).
相关jvm参数:
-XX:NewRation=n设置青年代所占堆区的空间比例
-XX:NewSize=n设置青年代所占内存大小
-XX:SurvivorRation=n设置S区与E区的空间比例
-XX:MaxTenuringThreshold=n
当青年代中对象的回收次数超过该值时,gc认为该对象够老,将该对象复制到老年代。事实上如果该值设为0,则jvm根本就不会用到S区,在E区内存不足时直接将存活对象复制到老年代。
垃圾回收算法:
青年代采用“复制”垃圾回收算法,复制算法比较适合于垃圾回收频繁且垃圾多的场合,能够避免内存碎片。该算法的垃圾回收会暂停当前的工作线程直到回收完毕,故在实际使用过程中应该根据系统自身的特点(实时性优先/吞吐量优先)选择合适的垃圾回收器。
老年代(Old)
老年代里存放的是一些长寿的对象,只有在青年代内存不足向老年代复制对象且老年代内存也不足的时候才会对老年代做垃圾回收。
垃圾回收算:
老年代采用“标记-清楚-压缩”垃圾回收算法,与复制算法不同,该算法适用的场合是回收频率低、垃圾少,该算法如果不执行压缩的话还会产生内存碎片。所谓压缩,就是指将内存区域内的对象往内存的一边对齐,腾出另外一边连续的空闲空间。显然,该算法要比青年代上的复制算法重量级得多。不过,该算法的垃圾回收可以并发式进行,即在不停止当前工作线程的情况下进行垃圾回收。
永久代(Perm)
该区域也叫“方法区”,主要用来存放类的字节码和元信息,以及常量的定义。java虚拟机规范不要求实现该区域的垃圾回收,原因有二:
1、该区域上的垃圾少,回收的性价比非常低;
2、判断一个类是否为垃圾比判断一个对象是否为垃圾昂贵得多,复杂度高。
鉴于此,我们对该区域的垃圾回收别报希望,只要记住一点就行了:永久代上不会主动进行垃圾回收。因此,在日常开发的过程中,尤其是在struts、hibernate等框架的使用上一定要留意,不要让动态生成的类占满了永久代区域。
分享到:
相关推荐
理解JVM内存结构和垃圾回收机制对于Java开发者至关重要,它可以帮助我们更好地优化程序性能,避免内存溢出等问题。通过调整JVM参数,如堆大小、新生代与老年代的比例、垃圾收集器的选择等,我们可以根据应用的需求...
JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel、Parallel Old...
本文将深入探讨JVM内存结构以及垃圾回收机制。 首先,我们来看看JVM的内存区域划分: 1. **程序计数器(Program Counter Register)**:每个线程都有自己的程序计数器,用于存储当前线程执行的字节码指令地址。 2...
Java虚拟机(JVM)的垃圾回收(GC)机制是Java程序高效运行的关键部分,它自动管理内存,释放不再使用的对象以避免内存泄漏。本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用...
本文将详细解析JVM内存结构以及垃圾回收机制。 首先,JVM内存主要分为四个区域: 1. **堆(Heap)**:这是Java应用程序中最大的内存区域,用于存储所有通过`new`关键字创建的对象实例。堆被进一步划分为新生代...
2. **运行时数据区**:即通常所说的JVM内存结构,包括方法区、堆、栈、本地方法栈和程序计数器。 3. **执行引擎**:解释或编译Java字节码并执行。 #### 三、运行时数据区详解 ##### 1. 方法区(Method Area) - **...
JVM的内存结构分为堆内存、方法区、栈内存、程序计数器和本地方法栈等几个主要部分。堆内存是所有线程共享的区域,用于存储对象实例。方法区存储类信息、常量、静态变量等。栈内存每个线程独享,存储方法调用时的...
Jvm内存结构主要分为五部分:堆、虚拟机栈、本地方法栈、程序计数器和方法区。 堆是Jvm中最大的内存区域,所有线程共享的,主要用来存储对象。堆可以分为年轻代和老年代两块区域。年轻代又可以分为一个Eden区和两个...
理解JVM内存结构和内存分配机制对于避免内存溢出(OutOfMemoryError)、提升程序性能、减少垃圾回收开销至关重要。开发者应关注内存配置、对象生命周期管理以及适当的垃圾回收策略,以优化应用程序的性能和稳定性。
本文将深入探讨JVM的核心原理、内存结构、优化策略以及垃圾回收机制。 首先,JVM的内存结构是理解其工作方式的关键。在JVM中,内存主要分为五个区域:程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8之后...
本资源详细讨论了 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、垃圾回收、堆和非堆内存、内存分配和限制等方面,为开发人员和运维人员提供了一份详细的指南,以帮助他们更好地理解和优化 JVM 的性能。
JVM内存主要分为堆内存(Heap)和栈内存(Stack)。堆内存主要用于存储对象实例,而栈内存用于存储方法调用时的局部变量和方法返回地址。堆内存又分为新生代(Young Generation)、老年代(Tenured Generation)和...
《虚拟机内存结构和垃圾回收》 Java的垃圾回收(Garbage Collection,简称GC)机制是其与C++等语言的重要区别,它自动处理内存的分配与回收,减轻了程序员的负担。然而,理解GC的工作原理对于优化应用程序性能至关...
JVM内存优化的目的是尽可能让对象都在新生代里分配和回收,避免频繁对老年代进行垃圾回收。以下是一些JVM内存优化的技巧: 1. 设置适当的堆大小:根据实际项目情况,设置适当的堆大小可以避免频繁的垃圾回收。 2. ...
Java虚拟机(JVM)是Java程序运行的基础,它为Java应用程序提供了...理解并掌握JVM内存结构有助于我们编写高效、稳定的Java代码,避免出现性能瓶颈和内存问题。通过监控和调优JVM内存参数,可以有效地提升应用的性能。
### JVM内存空间分配详解 #### 一、JVM内存模型概览 JVM(Java虚拟机)内存模型主要由以下几个部分组成:程序计数器、Java虚拟机栈、本地方法栈、Java堆以及方法区(在JDK 8之后称为元空间)。下面将对这几个部分...
一、JVM内存结构 JVM内存主要分为以下几个区域: 1. **堆内存(Heap Memory)**:这是Java对象的主要存储场所,分为年轻代和老年代。年轻代又细分为Eden区、Survivor From区和Survivor To区,用于新生对象的分配和...
内容概要:java八股文,本文全面介绍了Java面试中常见的基础和技术要点,涵盖Java基础知识、面向对象特性、关键字、集合框架、多线程、异常处理、JVM内存结构和垃圾回收机制、IO流等多个方面的内容。每部分内容均...
总结而言,JVM内存管理涉及多个层面,包括内存结构的划分、内存空间的分配与回收机制、以及内存分析工具的使用。对Java开发人员而言,理解这些内存管理机制不仅能够帮助其编写出更加稳定和高效的代码,还能在发生...
在面试中,深入理解JVM内存结构、垃圾回收机制及其优化策略,不仅可以帮助开发者解决性能问题,也是评估其专业技能的重要指标。通过上述知识点的详细阐述,希望能为面试者提供有力的准备,应对可能出现的挑战。