介绍在Java8中,运行时内存是如何工作的,对象的走向如何,Java7和Java8内存模型的变化又是什么?接下来让我给你解开谜团

运行时内存

基本组成如图:

其中新生代又分为Eden区、SurvivorFrom、SurvivorTo三个区,这么分的目的是因为年轻代采用的是复制算法进行垃圾回收。

年轻代

  1. Eden区:Java新对象都在这里(如果新对象的内存占用很大,则直接分配到老年代)。当Eden区内存不够时会触发Minor GC(新生代垃圾回收),对新生代区进行一次垃圾回收
  2. SurvivorFrom:因为复制算法需要将一个内存区域分为两半,From是其中一半,垃圾回收时会扫描SurvivorFrom区,查看是否有年龄超过15的对象,超过15(默认值,可以通过-XX:MaxTenuringThreshold来设置)的对象进入老年代,年龄小于15的进入SurvivorTo区,对象年龄+1
  3. SurvivorTo:保留一次Minor GC过程中的幸存者

工作过程

  1. Minor GC开始,把Eden和Survivor区域中存活的对象复制到SurvivorTo区(年龄超过15的进入老年代区),同时对这些对象的年龄+1(如果SurvivorTo不够位置了就放到老年代区)
  2. 复制完成后,清空Eden、SurvivorFrom区中的对象
  3. 最后,SurvivorTo和SurvivorFrom互换,原来的SurvivorTo成为下一次Minor GC的SurvivorFrom区

老年代

主要存放对象在应用程序中生命周期长的内存对象
老年代对象不会像年轻代一样,朝生夕死,相对来说比较稳定,所有MajorGC不会频繁执行
有以下几种情况会触发MajorGC:

  1. 老年代空间不够用时触发
  2. 大对象进入老年代,没有连续空间分配给大对象会提前触发一次MajorGC进行垃圾回收腾出空间存放大对象
  3. 对MinorGC后晋升到老年代的大小大于老年代剩余的空间触发
  4. 手动调用System.gc(),建议触发Full GC

元数据区(Metaspace)

在java8之前,叫做永久区,由于其内存大小受限于java堆内存,随者Class的增多很容易触发OOM,因此在java8中做了调整,Metaspace位于本地堆内存(native heap),OOM问题不复存在,默认元数据区内存大小只受本地内存大小的限制,也就是说本地内存多大,Metaspace就可以有多大

元空间的出现就是为了解决突出的类和类加载器元数据过多导致的OOM问题

PermGen与Metaspace的对比:

PermGen(老年代) Metaspace(元数据区)
它已从Java 8中删除 它是在Java 8中引入的
静态变量和常量池在方法去 常量池、静态成员变量等迁移到了堆中
PermGen始终具有固定的最大大小 默认情况下,元空间会根据基础操作系统自动增加其大小
连续的Java堆内存 本地内存(由底层操作系统提供)
没有效率的垃圾收集 高效的垃圾收集

有什么问题欢迎大家指正~~~

Java运行时内存工作过程相关推荐

  1. 深入理解java虚拟机一 JAVA运行时内存区域与class文件

    一 JAVA运行时内存区域 JVM在加载class文件时,会将class文件定义的数据结构转为运行时内存中的数据,那么jvm是如何安排运行时的内存区域呢? jvm将运行时内存划分为以下几个部分: 堆: ...

  2. java运行时内存模型

    运行时内存分为: 1.方法区 2.堆 3.虚拟机栈 4.本地方法栈 5.程序计数器 方法区.堆是共享的,所有线程都可以读取 虚拟机栈.本地方法栈.程序计数器是线程私有的,每个线程单独一套,它们在线程创 ...

  3. java运行时内存分配详解

    一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私 ...

  4. 运行时常量池在哪里_Java虚拟机详解(二)------运行时内存结构

    首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生 ...

  5. JVM运行时内存概念-堆栈及新生代、老年代、持久代

    JVM内存有一些按不同标准划分的概念,这里来理清一下. 一.首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实 ...

  6. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

  7. java执行内存_java运行时内存

    运行时数据区域 java运行时数据区域主要分为下面几个: 方法区 虚拟机栈 本地方法栈 堆 程序计数器 java运行时数据区域.jpg 程序计数器 它是一块较小的内存空间,可以看做是当前线程所指定的字 ...

  8. Java 运行时的内存划分

    Java 运行时的内存划分 程序计数器 记录当前线程所执行的字节码行号,用于获取下一条执行的字节码. 当多线程运行时,每个线程切换后需要知道上一次所运行的状态.位置.由此也可以看出程序计数器是每个线程 ...

  9. Java 虚拟机(JVM)运行时内存结构

    1.PC Register(pc寄存器) Java虚拟机线程都有自己的pc寄存器.一条Java虚拟机线程只会同时执行一个方法的代码,这个方法称为该线程的当前方法.如果这个方法不是native的,那么p ...

最新文章

  1. python字符串的美化_Python构造自定义方法来美化字典结构输出
  2. php限制接口访问次数_php暂停多长时间后继续执行代码
  3. 【转】赶集网mysql开发36军规
  4. 洗车房,无人车的噩梦
  5. xcode6 使用MJRefresh
  6. 机器学习初探:Logistic选股模型实证
  7. 2013年放假安排时间表 法定节假日安排通知 ( IS2120@BG57IV3)
  8. python鲜花水果商城毕业设计开题报告
  9. 5.3 闪电网络的设计
  10. 我们该如何高效的学习
  11. 练习聚合函数的综合练习题
  12. SfxMCP基于GB28181/RTSP/ONVIF协议实现H5无插件直播方案 - sfxlab
  13. 量化分析师的Python日记【Q Quant兵器谱之偏微分方程3的具体金融学运用】
  14. 24点游戏python版
  15. dns 刷新本地DNS缓存的方法
  16. 基于WEB的高校校车管理系统设计与实现
  17. lenovo L480 进入bios_华硕 N56VZ N56 因bios导致 黑屏 不亮机 解决方案
  18. 正则基础之——捕获组(capture group)
  19. LaTeX - 排版试卷(一面双页)
  20. 使用ArcMap将CAD数据转shp

热门文章

  1. mysql html 转义_HTML/Mysql/XML 转义字符,备查
  2. .Net水晶报表的使用总结
  3. 《HTML5与CSS3实战指南》——第2章 HTML5样式的标记2.1 The HTML5 Herald简介
  4. 面向对象开发方法概述
  5. 支付宝当前最新版集成2.1.2版本
  6. 从关系型数据库到非关系型数据库
  7. 拯救你的颈椎,笔记本支架如何选择?
  8. apolloxlua include关键字
  9. WCF发布到IIS的配置步骤
  10. 『TensorFlow』通过代码理解gan网络_中