引言
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...
本文将详细解析JVM内存结构以及垃圾回收机制。 首先,JVM内存主要分为四个区域: 1. **堆(Heap)**:这是Java应用程序中最大的内存区域,用于存储所有通过`new`关键字创建的对象实例。堆被进一步划分为新生代...
JVM堆相关知识 为什么先说JVM堆? JVM的堆是Java对象的活动空间,程序中的类的对象从中分配空间,其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作,当对象无用后,是GC来...
JVM的内存结构分为堆内存、方法区、栈内存、程序计数器和本地方法栈等几个主要部分。堆内存是所有线程共享的区域,用于存储对象实例。方法区存储类信息、常量、静态变量等。栈内存每个线程独享,存储方法调用时的...
Jvm内存结构主要分为五部分:堆、虚拟机栈、本地方法栈、程序计数器和方法区。 堆是Jvm中最大的内存区域,所有线程共享的,主要用来存储对象。堆可以分为年轻代和老年代两块区域。年轻代又可以分为一个Eden区和两个...
本文将深入探讨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内存主要分为以下几个区域: 1. **堆内存(Heap Memory)**:这是Java对象的主要存储场所,分为年轻代和老年代。年轻代又细分为Eden区、Survivor From区和Survivor To区,用于新生对象的分配和...
在面试中,深入理解JVM内存结构、垃圾回收机制及其优化策略,不仅可以帮助开发者解决性能问题,也是评估其专业技能的重要指标。通过上述知识点的详细阐述,希望能为面试者提供有力的准备,应对可能出现的挑战。
理解JVM内存结构对于优化Java程序至关重要。例如,合理设置新生代和老年代的比例,可以提高垃圾回收效率;控制栈帧大小和数量,能防止栈溢出;而了解直接内存的使用,可以帮助减少系统内存压力。 此外,JVM内存管理...
总之,理解和掌握JVM内存结构对于Java开发者来说是至关重要的,它可以帮助我们编写更高效、更稳定的代码,解决运行时可能出现的问题,并进行有效的性能调优。通过不断学习和实践,我们可以更好地驾驭这台强大的虚拟...
Java虚拟机(JVM)是Java程序运行的核心,它的内存结构对于理解和优化Java应用程序的性能至关重要。本笔记将深入探讨JVM内存的...这份"JVM内存结构笔记"将详细阐述这些内容,是学习和研究JVM内存管理的重要参考资料。
垃圾回收机制可以分为两种:部分垃圾回收和完全垃圾回收。部分垃圾回收是指JVM在年轻代中回收无用的对象,而完全垃圾回收是指JVM在整个堆中回收无用的对象。 垃圾回收机制的触发条件包括:年轻代的对象达到一定年龄...
总结来说,Linux和JVM内存结构分析是提升系统效率和稳定性的重要手段。通过阅读和分析上述文件,我们可以深入了解系统资源的使用情况,进而进行针对性的调优。对于IT专业人士而言,掌握这些知识不仅能提升工作效率,...