JVM笔记五-堆区

在JVM中,堆区是重中之重。通过前面文章的学习,我们知道了,栈区是不会有垃圾回收的,所以,经常说的垃圾回收,其实就是回收的是堆区的数据。在这里,我们将会看到传说中的,新生代、老年代、永久代(元空间)。凯哥Java(kaigejava)欢迎大家一起学习。

堆(Heap):

一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行,堆内存分为三个部分:

堆内存分区:

Young Generation Space 新生区 Young/New

Tenure generation space 老年代 Old/Tenure

Permanent space 永久区/元空间 Perm

Java 7之前的堆内存示意图:

编辑

简版流程:

编辑

编辑

新生区是类的诞生、成长、消亡的区域,一个类在这里产生、应用,最后被垃圾回收器收集,结束生命。

新生区又分为两部分:伊甸园区(Eden space)和幸存者区(Survivor space)。所有的类都是在伊甸园区被new出来的。

幸存区有两个:0区(Survivor 0 space)和1区(Survivor 1 space).

当伊甸园区的空间用完时候,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC,也叫轻GC 或者是YGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后伊甸园中的剩余对象移动到幸存0区(也叫from区)。若幸存0区也满了,再对该地区进行垃圾回收,然后移动到1区(也叫to区)。

如果1区也满了怎么办呢?在经历了15次YGC后,幸存1区也满了,那么这个时候,JVM将会把这些数据移动到养老区。如果养老区也满了,这个时候就会进行MajorGC(也称Full GC 检查FGC)。执行full GC对养老区的内存进行清理。如果养老区执行了Full GC之后,发现依然无法进行对象的保存,这个时候就会出现OOM(OutOfMemoryError)异常了。

如果出现了java.lang.OutOfMemoryError:java heap space异常。说明Java虚拟机的堆内存不够用了。主要原因有以下两种:

1:java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整

2:代码中创建了大量的大对象,并且长时间不能被垃圾回收器回收的(内存地址被引用了)

当你的才华撑不起你的野心的时候,你就应该静下心来学习;

当你的能力还驾驭不了你的目标时,就应该沉下心来,历练;

梦想,不是浮躁,而是沉淀和积累,只有拼出来的美丽,没有等出来的辉煌,机会永远是留给最渴望的那个人,学会与内心深处的你对话,问问自己,想要怎样的人生,静下心来学习,耐心沉淀,送给自己,共勉!

JVM笔记五-堆区的更多相关文章

  1. JVM内存模型——堆(heap)、栈(stack)和方法区(method)

      JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:堆内存用于存放由new创建的对象和数组.堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的 ...

  2. [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...

  3. JVM 内存初学 堆(heap)、栈(stack)和方法区(method)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...

  4. 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...

  5. JVM内存初学 堆、栈、方法区

    转自: http://www.open-open.com/lib/view/open1432200119489.html 这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解J ...

  6. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)

    想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...

  7. 转 方法区(method) )、栈区(stack)和堆区(heap)之JVM 内存初学

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...

  8. 【转】 Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...

  9. JVM运行时数据区--堆

    一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 核心概述 1.一个jvm实例只存在一个堆内存,堆也是java内 ...

随机推荐

  1. Zabbix-4.0-设置钉钉报警脚本

    问题:当服务器发生报错时,有一个信息能实现自动发送到我的手机或者应用上,以达到对服务器的实时的监控与处理.邮件与短信不能满足实时性,于是想到了钉钉的通知. 思路:在钉钉里面建一个群,群里面拉个机器人. ...

  2. 【Azure DevOps系列】Azure DevOps构建并发布Nuget程序包

    在Azure DevOps中,管道可以用来构建解决方案,O(∩_∩)O哈哈~快万能了,本章主要介绍如何创建Nuget包并且将其发布到Nuget服务器的过程. 前面我创建了一个非常简单的类库,这边我不做 ...

  3. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

  4. AutoGenerator自动生成代码

    程序猿学社: https://blog.csdn.net/qq_16855077/article/details/105316295

  5. InnoDB 引擎中的索引类型

    首先索引是一种数据结构,并且索引不是越多越好.合理的索引可以提高存储引擎对数据的查询效率. 形象一点来说呢,索引跟书本的目录一样,能否快速的查找到你需要的信息,取决于你设计的目录是否合理. MySQL ...

  6. weekly-contest-205

    weekly-contest-205 1 / 5507. 替换所有的问号 class Solution { public String modifyString(String s) { StringB ...

  7. 分布式事务框架.NetCore CAP总结

    来自CAP原作者yang-xiaodong的原理图: 本文撰写者:cmliu,部分内容引用自官方文档,部分内容待更新# .NetCore CAP # 1,简介 CAP 是一个遵循 .NET Stand ...

  8. [剑指Offer]17-打印从1到最大的n位数(递归)

    题目 如题,输入n,则从1打印至99. 题解 考虑到n比较大会有大数问题,所以使用字符数组存储数. 由题可用递归求n位全排列,即为所得. 具体地,用临时字符数组用来存答案,每次递归填好一位,都填好后输 ...

  9. 在自己win系统里面给idea配置Git

    这里直接是写好的步骤 下载链接

  10. git修改未push和已经push的注释信息

    修改还未push的注释: git commit --amend 修改后保存退出. 刚刚push到远端还没有人其他人下载或改动的: git commit --amend1进入修改页面修改注释信息,修改后 ...