`
youyu4
  • 浏览: 435469 次
社区版块
存档分类
最新评论

JVM之堆

 
阅读更多

JVM之堆

 

堆只要放实例对象和数组,当堆内存需要占用的空间大于我们设置的只,就会出OutOfMemoryError。

 

 

堆内存结构

 

  • JVM堆(Heap)= 新生代 + 旧生代
  • 新生代(Young)= Eden区 + From Survivor区 + To Survivor区


 

 

堆内存的默认比例:

 

  • 新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 )
  • 新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小
  • Edem : from : to = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 )
  • Eden = 8/10 的新生代空间大小,from = to = 1/10 的新生代空间大小

注意:

      JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总是有一块 Survivor 区域是空闲着的。

      因此,新生代实际可用的内存空间为 9/10 ( 即90% )的新生代空间。

 

 

 

新生代

 

所有新生成的对象首先都是放在年轻代。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。

 

大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当一个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当另一个Survivor区也满了的时候,从前一个Survivor区复制过来的并且此时还存活的对象,将可能被复制到年老代。

 

如何延长对象在新生代的存活时间

 

  • 加大新生代,这样就不会那么容易发生垃圾回收
  • 增加Survivor区的个数,其实Survivor区可以不止两个
  • 修改阈值-XX:MaxTenuringThreshold,默认是15,对象经过15次Minor GC后会复制到旧生代

针对新生代的垃圾回收是Minor GC

 

减少Minor GC的方法:加大新生代

 

 

 

旧生代

 

在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

 

针对年老代的垃圾回收即 Full GC

 

减少Full GC的方法:减少Minor GC次数或者加大旧生代

 

 

 

这样分配堆内存主要跟垃圾回收的机制有关,后面再详细讲解垃圾回收,简单步骤如下:

 

  • 新实例化的对象,会存放在Eden
  • 当Eden空间不够的时候,就复制到Survivor区
  • 如果Survivor区的空间不够,就会触发Minor GC(新生代的垃圾回收),将无用的对象回收掉,释放内存,剩下的对象复制到To Survivor区
  • 下一次垃圾回收,就会将Eden和To Survivor区回收后剩下的对象,复制到From Survivor区
  • 在复制的过程中,对象的复制一次年龄会加1,到达一定次数(默认15),对象就要被移动到旧生代
  • 当旧生代空间不足时,才会进行Full GC(全垃圾回收)

 

 

JVM堆的相关配置



 

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64但小于1G。

JVM最大分配的内存由-Xmx指定,默认是物理内存的 1/4但小于1G。

 

 

 

Out of Memory 的两个原因

 

1. 年老代溢出,表现为:java.lang.OutOfMemoryError:Javaheapspace

这是最常见的情况,产生的原因可能是:设置的内存参数Xmx过小或程序的内存泄露及使用不当问题。

例如循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存。还有的时候虽然不会报内存溢出,却会使系统不间断的垃圾回收,也无法处理其它请求。这种情况下除了检查程序、打印堆内存等方法排查,还可以借助一些内存分析工具,比如MAT就很不错。

 

2. 永久代溢出,表现为:java.lang.OutOfMemoryError:PermGenspace

 

通常由于永久代设置过小,动态加载了大量Java类而导致溢出,解决办法唯有将参数 -XX:MaxPermSize 调大(一般256m能满足绝大多数应用程序需求)。将部分Java类放到容器共享区(例如Tomcat share lib)去加载的办法也是一个思路,但前提是容器里部署了多个应用,且这些应用有大量的共享类库。

 

  • 大小: 10.5 KB
  • 大小: 38.7 KB
分享到:
评论

相关推荐

    JVM中[堆]的所有内容-pdf

    Java虚拟机(JVM)的堆内存是Java应用程序中存储对象实例的主要区域,它在JVM启动时被创建,并且其大小可以根据需求进行调整。堆内存可以被所有线程共享,其中包含了年轻代、老年代以及(在某些版本中)永久代或元...

    2020 宋红康 JVM 08 堆.pptx

    2020 宋红康 JVM 第 08 章 学习记录PPT。本章主要是讲述 堆空间划分、分配和回收。另外包括逃逸分析相关内容

    jvm中的堆.xmind

    自己总结的jvm中堆的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

    jvm 配置jvm参数

    根据操作系统限制,我们可能无法充分利用所有物理内存,因为32位系统通常限制JVM的最大堆大小在1.5GB到2GB之间。为了达到最优性能,我们可以按照以下步骤配置JVM参数: 1. **设置堆大小**:考虑到32位系统的限制,...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    HotSpot是JVM的一种实现,是Java虚拟机历史上最重要的技术之一。 JIT编译是JVM中的一个关键特性,它通过即时编译技术将Java字节码动态编译成本地代码,提高程序的执行速度。这个过程包括解释执行和JIT编译,解释...

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    JVM的那些事.pptx

    - **-Xmx**:设置JVM的最大堆内存大小。 - **-Xms**:设置JVM初始堆内存大小。 - **-XX:MaxNewSize**:设置年轻代的最大内存大小。 - **-XX:NewSize**:设置年轻代的初始内存大小。 - **-XX:MaxPermSize**:设置永久...

    jvm 详细介绍,了解jvm各个组成部分和功能

    堆栈结构是 JVM 中重要的内存管理组件之一。它主要用于存储方法调用过程中的局部变量、操作数栈等数据。每个线程在其生命周期内都会有一个对应的堆栈结构,其中包含了一个或多个帧(Frame)。每个帧对应一个方法调用...

    深入理解JVM

    3. **运行时数据区**:JVM在运行过程中会创建多个区域,如程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8后被元空间取代)。每个区域都有特定的功能,例如,堆存储对象实例,栈用于方法调用。 4. **内存...

    java基础之JVM

    ### Java基础之JVM #### 一、JVM简介 **1.1 JVM是什么** Java Virtual Machine (JVM),即Java虚拟机,是Java技术的核心组成部分之一。它是一种抽象计算机,能够执行Java字节码(一种中间代码)的虚拟机环境。JVM...

    jvm 启动过程 JVM 原理

    JVM是Java Virtual Machine的缩写,它是Java平台的核心组件之一。它的主要任务是将编译后的Java类文件(.class文件)中的字节码转换为特定平台的机器码,实现了Java的“一次编写,到处运行”的跨平台特性。JVM由多个...

    JVM中堆内存和栈内存的区别

    Java虚拟机(JVM)是Java程序运行的基础,它将内存划分为多个区域,其中堆内存(Heap)和栈内存(Stack)是最基础且重要的两个部分。了解它们的区别对于优化程序性能至关重要。 栈内存主要用于存储程序运行过程中的...

    JVM之对象在堆中的流转 - 副本.md

    JVM之对象在堆中的流转 - 副本

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    JVM系列之性能调优参考手册(实践篇).pdf

    例如,“-Xms”和“-Xmx”分别用于设置JVM的初始堆内存和最大堆内存,“-Xss”用于设置线程堆栈大小,“-Xmn”用于设置年轻代内存大小。而“-XX”参数中,“-XX:MaxPermSize”用于设置方法区的最大内存大小。 除了...

    JVM堆内存溢出后,其他线程是否可继续工作的问题解析

    JVM堆内存溢出是Java开发中常见的问题之一,当堆内存溢出时,其他线程是否可继续工作?这是一道经典的面试题。通过对JVM堆内存溢出的分析,我们可以了解到当一个线程出现OOM异常时,它所占据的内存资源会全部被释放...

    JVM内存溢出问题解析

    当内存剩余不到 40 %时,JVM 会增大堆到 Xmx 设置的值,当内存剩余超过 70 %时,JVM 会减小堆到 Xms 设置的值。 垃圾回收 GC 的角色是在 JVM 中调用垃圾回收的机制。GC 的触发机会增加 GC 的触发机会。为了避免...

    JVM垃圾回收机制与GC性能调优

    本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用程序的主要内存区域,用于存储所有类实例和数组。它分为三个主要区域:新域(Young Generation)、旧域(Old Generation)和...

    JVM堆模型

    《JVM堆模型详解》 Java虚拟机(JVM)是Java程序运行的核心,而堆内存作为JVM中最大的一块内存区域,对于程序的运行效率和稳定性起着至关重要的作用。本文将深入探讨JVM堆模型,理解其工作原理,以及如何通过优化...

    狂神说JVM探究.rar

    - 使用JVM参数进行性能优化,例如-Xms、-Xmx设定堆内存大小,-XX:NewRatio调整新生代与老年代比例。 - 调整GC策略,如选择G1、Parallel GC、CMS等。 7. **类加载器**: - Bootstrap ClassLoader、Extension ...

Global site tag (gtag.js) - Google Analytics