`

JVM内存结构系列:HotSpot内存结构最清晰

    博客分类:
  • JAVA
 
阅读更多

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停止所有在堆中运行的线程并执行清除动作

 

 

HotSpot 虚拟机定义两个Generation:Young Generation (有时候也称为Nursery)和Old Generation。Young Generation由一个Eden Space和两个Survivor Spaces组成,虚拟机初始是分配所有的对象到Eden Space,许多对象也是在这里死去。当它执行一个minor GC的时候,虚拟机将从Eden Space中移动一些残余的对象到其中的一个Survivor Spaces中。虚拟机将在Survivor Spaces中生存足够长时间的对象移动到Old Generation的Tenured Spaces中。当Tenured Generation被填满,则将执行一个完全GC,这个完全GC非常的慢,因为它要处理所有存活着的对象。Permanent Generation 控制着所有虚拟机自己映射的数据,如类和对象的方法。

 

 

VM内存划分为年轻代(Young)和年老代(Tenured),Young GC是指是针对年轻代中的无用对象进行垃圾回收,而Full GC则会对年轻代和年老代中的无用对象均进行垃圾回收。上图中Virtual为可伸缩部分,即初始可以指定一个内存空间最大值和初始值,随着程序运行空间会进行增长。

Young:年轻代,具体包括EdenSurvivor0Survivor1

Eden:初始分配的对象最先存放到这里;

Survivor0Survivor1:存放Eden中经过若干次Young GC仍存活的对象,Survivor0Survivor1轮流被使用,当GC执行时,会从其中一个空间中拷贝存活对象到另一空间中。

Tenured:存放Survivor1中经过若干次Young GC仍存活的对象,这里的对象只有Full GC才可能回收;

 

Perm:存放Java类,常量等静态内容。

 

分享到:
评论

相关推荐

    JVM内存管理白皮书

    此外,文档的结构化布局使得内容条理清晰,即使是初学者也能够逐步建立起对JVM内存管理的全面认识。通过这份白皮书的学习,读者将能够深入理解JVM内存管理的复杂性,并掌握处理内存问题的有效方法。

    JVM详解及调优

    **2.3 Sun JVM内存管理(优化)** - **堆(Heap)**: 用于存放所有Java对象实例和数组的空间。堆是所有线程共享的,因此需要处理好并发访问的问题。 - **方法区域(Method Area)**: 存储每个类的信息、常量池、...

    JVM中[本地方法栈]的所有内容-xmind脑图pdf

    例如,HotSpot JVM为了优化性能,选择了将本地方法栈与虚拟机栈合并,这样减少了内存分配和管理的复杂性。这种设计简化了内存模型,同时也减少了线程切换的开销。 本地方法栈也会遇到内存溢出的问题,当栈空间不...

    openjdk-03

    - **项目结构**:OpenJDK 项目包含 HotSpot JVM、JDK 工具、核心类库等组件,每个组件都有清晰的源码目录结构,如 `src/hotspot` 代表 HotSpot 虚拟机代码,`src/jdk` 包含 Java API 的实现。 2. **编译过程** - ...

    Java Program in Action

    HotSpot VM是当前最流行的JVM实现之一,它是Oracle公司维护的开源项目。HotSpot VM的主要特点包括: - **即时编译技术**:能够在运行时自动选择热点代码进行编译,从而提高性能。 - **垃圾回收机制**:自动管理内存...

    OpenJDK11U-jdk_x64_windows_openj9_11.0.10_9_openj9-0.24.0.zip

    3. **动态CDS(Class-Data Sharing)**:这是一种优化技术,允许多个JVM实例共享已加载类的数据,减少内存占用并提升启动速度。在OpenJ9中,CDS与动态共享类数据(DAS)结合,提供了更好的性能。 4. **本地变量类型...

    值得Java程序猿阅读的书籍

    他的设计模式讲解清晰,涵盖了定义、结构、实现、优缺点等关键点。理解和掌握设计模式对于提升代码质量和可维护性至关重要,设计模式的应用能让你的代码更具灵活性和扩展性。 除了这些,还有其他值得一看的书籍,如...

    javajdk源码学习-java-source-code:JavaJDK源代码学习笔记

    理解JVM的工作原理,可以帮助我们优化应用程序的内存使用,提升运行效率。 总的来说,Java JDK源码学习是一个系统且深入的过程,涉及到类库设计、数据结构、算法、内存管理、并发控制等多个方面。通过对源码的分析...

Global site tag (gtag.js) - Google Analytics