JAVA虚拟机(JVM)中的堆

介绍

Java虚拟机中的堆是一个非常重要的区域,它一般用来存储实例对象和数组的区域,它存在于运行时数据区,同时它是线程共享的区域,在堆内存不足时会发生OOM,也是Java中的垃圾回收器回收的主要区域。但是不正确的内存管理可能导致内存泄漏,即不需要的对象也没有被垃圾回收器回收掉。

位置与内部结构

在JDK7和JDK8中的堆的内存结构不完全一致,本文针对JDK8中的堆结构进行说明。

在JDK8中堆被分为了两部分,分别是年轻代和老年代。

年轻代

年轻代:年轻代一般存储的是刚创建的实例和生命周期比较短的对象,而且年轻代是垃圾回收频繁回收的区域。

年轻代又被分成了三部分 Eden(伊甸园)区,S0(幸存者区),S1(幸存者区) 。 他们的默认内存大小比值是 8 :1 :1。在垃圾回收时起到了关键作用,本文只介绍堆,暂不介绍垃圾回收。

老年代

老年代:老年代一般存储的是生命周期较长的对象,这些对象通常是由年轻代多次垃圾回收后仍未回收的对象晋升上来的。老年代的垃圾回收的频率没有年轻代的垃圾回收的频率频繁。

在默认情况下年轻代和老年代的内存大小占比为 1 :2。这个内存大小可以由开发者自己设置。

线程共享

Java虚拟机的堆是线程共享的,因此需要同步机制来避免并发同步访问时带来的数据不一致的问题,例如sync和juc包下的同步工具。

内存泄漏和内存溢出

内存泄漏:当一个对象没有被任何线程引用即没有被GCRoot对象利用可达性分析算法引用到,但是仍然在内存中占用内存空间,就会产生内存泄漏。这一般是长生命周期对象 引用短生命周期而造成的。

内存溢出:当堆内存中的对象过多,并且垃圾回收后依然内存不足,就会发生内存溢出(OOM)。

相关推荐
L2ncE40 分钟前
高并发场景数据与一致性的简单思考
java·后端·架构
武昌库里写JAVA40 分钟前
使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程
java·vue.js·spring boot·sql·学习
小指纹41 分钟前
河南萌新联赛2025第(六)场:郑州大学
java·开发语言·数据结构·c++·算法
叶~璃44 分钟前
云计算:企业数字化转型的核心引擎
java
码luffyliu1 小时前
MySQL:MVCC机制及其在Java秋招中的高频考点
java·数据库·mysql·事务·并发·mvcc
程序员鱼皮1 小时前
这套 Java 监控系统太香了!我连夜给项目加上了
java·前端·ai·程序员·开发·软件开发
岁忧1 小时前
(nice!!!)(LeetCode 每日一题) 1277. 统计全为 1 的正方形子矩阵 (动态规划)
java·c++·算法·leetcode·矩阵·go·动态规划
律品1 小时前
pytest的前置与后置
开发语言·python·pytest
S妖O风F1 小时前
IDEA报JDK版本问题
java·ide·intellij-idea
Mr. Cao code2 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat