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)去加载的办法也是一个思路,但前提是容器里部署了多个应用,且这些应用有大量的共享类库。
相关推荐
Java虚拟机(JVM)的堆内存是Java应用程序中存储对象实例的主要区域,它在JVM启动时被创建,并且其大小可以根据需求进行调整。堆内存可以被所有线程共享,其中包含了年轻代、老年代以及(在某些版本中)永久代或元...
2020 宋红康 JVM 第 08 章 学习记录PPT。本章主要是讲述 堆空间划分、分配和回收。另外包括逃逸分析相关内容
自己总结的jvm中堆的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者
HotSpot是JVM的一种实现,是Java虚拟机历史上最重要的技术之一。 JIT编译是JVM中的一个关键特性,它通过即时编译技术将Java字节码动态编译成本地代码,提高程序的执行速度。这个过程包括解释执行和JIT编译,解释...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
- **-Xmx**:设置JVM的最大堆内存大小。 - **-Xms**:设置JVM初始堆内存大小。 - **-XX:MaxNewSize**:设置年轻代的最大内存大小。 - **-XX:NewSize**:设置年轻代的初始内存大小。 - **-XX:MaxPermSize**:设置永久...
堆栈结构是 JVM 中重要的内存管理组件之一。它主要用于存储方法调用过程中的局部变量、操作数栈等数据。每个线程在其生命周期内都会有一个对应的堆栈结构,其中包含了一个或多个帧(Frame)。每个帧对应一个方法调用...
3. **运行时数据区**:JVM在运行过程中会创建多个区域,如程序计数器、虚拟机栈、本地方法栈、堆和方法区(在Java 8后被元空间取代)。每个区域都有特定的功能,例如,堆存储对象实例,栈用于方法调用。 4. **内存...
### Java基础之JVM #### 一、JVM简介 **1.1 JVM是什么** Java Virtual Machine (JVM),即Java虚拟机,是Java技术的核心组成部分之一。它是一种抽象计算机,能够执行Java字节码(一种中间代码)的虚拟机环境。JVM...
JVM是Java Virtual Machine的缩写,它是Java平台的核心组件之一。它的主要任务是将编译后的Java类文件(.class文件)中的字节码转换为特定平台的机器码,实现了Java的“一次编写,到处运行”的跨平台特性。JVM由多个...
Java虚拟机(JVM)是Java程序运行的基础,它将内存划分为多个区域,其中堆内存(Heap)和栈内存(Stack)是最基础且重要的两个部分。了解它们的区别对于优化程序性能至关重要。 栈内存主要用于存储程序运行过程中的...
例如,“-Xms”和“-Xmx”分别用于设置JVM的初始堆内存和最大堆内存,“-Xss”用于设置线程堆栈大小,“-Xmn”用于设置年轻代内存大小。而“-XX”参数中,“-XX:MaxPermSize”用于设置方法区的最大内存大小。 除了...
JVM之对象在堆中的流转 - 副本
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
JVM堆内存溢出是Java开发中常见的问题之一,当堆内存溢出时,其他线程是否可继续工作?这是一道经典的面试题。通过对JVM堆内存溢出的分析,我们可以了解到当一个线程出现OOM异常时,它所占据的内存资源会全部被释放...
当内存剩余不到 40 %时,JVM 会增大堆到 Xmx 设置的值,当内存剩余超过 70 %时,JVM 会减小堆到 Xms 设置的值。 垃圾回收 GC 的角色是在 JVM 中调用垃圾回收的机制。GC 的触发机会增加 GC 的触发机会。为了避免...
本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用程序的主要内存区域,用于存储所有类实例和数组。它分为三个主要区域:新域(Young Generation)、旧域(Old Generation)和...
《JVM堆模型详解》 Java虚拟机(JVM)是Java程序运行的核心,而堆内存作为JVM中最大的一块内存区域,对于程序的运行效率和稳定性起着至关重要的作用。本文将深入探讨JVM堆模型,理解其工作原理,以及如何通过优化...
- 使用JVM参数进行性能优化,例如-Xms、-Xmx设定堆内存大小,-XX:NewRatio调整新生代与老年代比例。 - 调整GC策略,如选择G1、Parallel GC、CMS等。 7. **类加载器**: - Bootstrap ClassLoader、Extension ...
《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是至关重要的环节,良好的内存管理能够优化应用性能,防止内存泄漏,提升系统稳定性。MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具...