jvm区域总体分两类,heap区和非heap区。heap区又分:Eden Space(伊甸园)、Survivor Space(幸存者区)、Tenured Gen(老年代-养老区)。 非heap区又分:Code Cache(代码缓存区)、Perm Gen(永久代)、Jvm Stack(java虚拟机栈)、Local Method Statck(本地方法栈)。
HotSpot虚拟机GC算法采用分代收集算法:
1、一个人(对象)出来(new 出来)后会在Eden Space(伊甸园)无忧无虑的生活,直到GC到来打破了他们平静的生活。GC会逐一问清楚每个对象的情况,有没有钱(此对象的引用)啊,因为GC想赚钱呀,有钱的才可以敲诈嘛。然后富人就会进入Survivor Space(幸存者区),穷人的就直接kill掉。
2、并不是进入Survivor Space(幸存者区)后就保证人身是安全的,但至少可以活段时间。GC会定期(可以自定义)会对这些人进行敲诈,亿万富翁每次都给钱,GC很满意,就让其进入了Genured Gen(养老区)。万元户经不住几次敲诈就没钱了,GC看没有啥价值啦,就直接kill掉了。
3、进入到养老区的人基本就可以保证人身安全啦,但是亿万富豪有的也会挥霍成穷光蛋,只要钱没了,GC还是kill掉。
分区的目的:新生区由于对象产生的比较多并且大都是朝生夕灭的,所以直接采用标记-清理算法。而养老区生命力很强,则采用复制算法,针对不同情况使用不同算法。
非heap区域中Perm Gen中放着类、方法的定义,jvm Stack区域放着方法参数、局域变量等的引用,方法执行顺序按照栈的先入后出方式。
以上转自:http://lhc1986.iteye.com/blog/1421832
以下转自:http://www.cnblogs.com/xhr8334/archive/2011/12/01/2270994.html
GC工作机制
SUN的jvm内存池被划分为以下几个部分:
Eden Space (heap)
内存最初从这个线程池分配给大部分对象。
Survivor Space (heap)
用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
Tenured Generation (heap)
用于保持已经在survivor space内存池中存在了一段时间的对象。
Permanent Generation (non-heap)
保存虚拟机自己的静态(reflective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的。
Code Cache (non-heap)
HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)。
简单来讲,jvm的内存回收过程是这样的:
对象在Eden Space创建,当Eden Space满了的时候,gc就把所有在Eden Space中的对象扫描一次,把所有有效的对象复制到第一个Survivor Space,同时把无效的对象所占用的空间释放。当Eden Space再次变满了的时候,就启动移动程序把Eden Space中有效的对象复制到第二个Survivor Space,同时,也将第一个Survivor Space中的有效对象复制到第二个Survivor Space。如果填充到第二个Survivor Space中的有效对象被第一个Survivor Space或Eden Space中的对象引用,那么这些对象就是长期存在的,此时这些对象将被复制到Permanent Generation。
若垃圾收集器依据这种小幅度的调整收集不能腾出足够的空间,就会运行Full GC,此时jvm gc停止所有在堆中运行的线程并执行清除动作。
相关推荐
Java 虚拟机(JVM)中存在 PermGen(内存永久保存区域), PermGen 中存储了常量池、字段与方法数据及代码。堆内存模型分为 Eden Space、Survivor Space 和 Tenured Space 三个区域。新对象首先在 Eden Space 创建,...
堆内存主要包括Eden空间、Survivor空间和Tenured空间。Eden空间用于对象的创建,当Eden空间不足时,会触发Minor GC(小垃圾收集),将无效对象清除并将部分对象移至Survivor空间或Tenured空间。Tenured空间用于存放...
JVM内存主要分为以下几个区域: 1. **年轻代(Young Generation)**:分为Eden区和两个Survivor区。大多数对象在Eden区创建,当Eden区满时,会触发Minor GC,将存活的对象复制到Survivor区。 2. **年老代(Tenured ...
永久代主要存储类、方法和字段对象,过多的类加载可能导致`java.lang.OutOfMemoryError: PermGen space`错误,通常重启应用服务器可以解决这个问题。老年代保存生命周期较长的对象,而年轻代则分为Eden区、两个大小...
它打破了传统JVM内存区域的划分,将堆内存划分为多个大小相等的Region,每个Region既可以包含年轻代对象,也可以包含老年代对象。G1采用了混合收集(Mixed GC)策略,能够在一次GC过程中同时回收年轻代和老年代的...
在详细介绍Java 8内存模型之前,需要了解的是,JVM(Java虚拟机)在启动时,操作系统会为JVM进程分配一系列内存区域,这些内存区域包括堆(Heap)、元空间(MetaSpace)、线程堆栈(Thread Stack)、共享库(Shared ...
Java虚拟机(JVM)在运行Java程序时,会分配不同的内存区域,包括堆空间(Heap Space)和永久代空间(PermGen Space)。这两个区域的设置不当可能导致内存溢出错误,影响程序的稳定性和效率。 1. **Java Heap Space...
新生代又细分为Eden空间和两个Survivor空间(From Space和To Space),大部分对象在Eden区域创建,经过垃圾收集后,存活的对象会转移到Survivor空间,再经过多次GC仍然存活的对象进入老年代。 垃圾收集(Garbage ...
1. **内存管理**:JVM内存分为堆内存(Heap)和非堆内存(Non-Heap),包括年轻代(Young Generation)、老年代(Tenured Generation)以及永久代(PermGen,Java 8后被元空间(Metaspace)取代)。了解每个区域的...
JVM内存主要分为堆(Heap)和非堆(Non-Heap)两部分,堆中又细分为年轻代(Young)、年老代(Tenured)和持久代(Perm),非堆主要包含方法区(Method Area)。下面我们将深入探讨JVM内存管理和垃圾回收机制。 **1...
7. **堆内存结构**:堆内存由新生代(Young Generation)、老年代(Tenured Generation)和永久代( Perm Gen,已被元空间替代)组成。新生代又分为Eden区、From Survivor区和To Survivor区,用于新生对象的分配和...
3. **-XX:PermSize**: 设置永久代(PermGen space)的初始大小。例如,`-XX:PermSize=256m`表示永久代初始大小为256MB。 4. **-XX:MaxPermSize**: 设置永久代的最大大小。例如,`-XX:MaxPermSize=512m`表示永久代...
- **PermGen/Metaspace Overflow**:持久代/元空间溢出,通常由于过多的类或大型静态变量引起,可通过增大相应区域大小或限制类加载。 9. **JIT编译器(Just-In-Time Compiler)**: - **HotSpot** JVM包含C1和C2...
常见的内存错误包括`java.lang.OutOfMemoryError: Heap space`(堆空间不足)、`java.lang.OutOfMemoryError: PermGen space`(方法区空间不足)和`java.lang.StackOverflowError`(栈溢出)。这些错误通常由于物理...
在HotSpot JVM中,堆被进一步细分为新生代(Young Generation)和老年代(Old/Tenured Generation),新生代又分为伊甸园(Eden Space)、From Survivor Space和To Survivor Space三个部分,用于垃圾收集的策略。...
新生代又进一步细分为伊甸园空间(Eden Space)、幸存者1区(Survivor Space 1)和幸存者2区(Survivor Space 2),其中新创建的对象首先被分配到伊甸园,然后在GC(垃圾收集)过程中,存活下来的对象会被移动到...
- **内存区域**:显示了GC前后各内存区域的使用情况和变化。 - **耗时**:括号内的数字表示GC过程的持续时间。 通过深入理解JVM的架构、内存管理和垃圾回收机制,结合适当的性能调优策略和工具,可以显著提升Java...
堆内存又细分为年轻代(Young Generation)、老年代(Tenured Generation)和永久代(Perm Gen)或元空间(Metaspace)(在Java 8及以后版本)。理解这些区域的分配和垃圾收集机制是调优的第一步。 1. 年轻代:用于...
- ** PermGen/ Metaspace 溢出**:类信息过多,方法区空间不足。 - **栈溢出(Stack Overflow)**:递归深度过深或大量线程导致栈空间耗尽。 7. **JVM与多线程**: - **线程调度**:包括抢占式调度和协作式调度...
JVM运行Java程序时,会将其内存划分成若干个不同的数据区域,包括程序计数器、虚拟机栈、本地方法栈、堆以及方法区。 程序计数器是占用内存空间最小的区域之一,它的主要作用是记录线程所执行的字节码指令的地址,...