Java运行时内存工作过程
介绍在Java8中,运行时内存是如何工作的,对象的走向如何,Java7和Java8内存模型的变化又是什么?接下来让我给你解开谜团
运行时内存
基本组成如图:
其中新生代又分为Eden区、SurvivorFrom、SurvivorTo三个区,这么分的目的是因为年轻代采用的是复制算法进行垃圾回收。
年轻代
- Eden区:Java新对象都在这里(如果新对象的内存占用很大,则直接分配到老年代)。当Eden区内存不够时会触发Minor GC(新生代垃圾回收),对新生代区进行一次垃圾回收
- SurvivorFrom:因为复制算法需要将一个内存区域分为两半,From是其中一半,垃圾回收时会扫描SurvivorFrom区,查看是否有年龄超过15的对象,超过15(默认值,可以通过-XX:MaxTenuringThreshold来设置)的对象进入老年代,年龄小于15的进入SurvivorTo区,对象年龄+1
- SurvivorTo:保留一次Minor GC过程中的幸存者
工作过程
- Minor GC开始,把Eden和Survivor区域中存活的对象复制到SurvivorTo区(年龄超过15的进入老年代区),同时对这些对象的年龄+1(如果SurvivorTo不够位置了就放到老年代区)
- 复制完成后,清空Eden、SurvivorFrom区中的对象
- 最后,SurvivorTo和SurvivorFrom互换,原来的SurvivorTo成为下一次Minor GC的SurvivorFrom区
老年代
主要存放对象在应用程序中生命周期长的内存对象
老年代对象不会像年轻代一样,朝生夕死,相对来说比较稳定,所有MajorGC不会频繁执行
有以下几种情况会触发MajorGC:
- 老年代空间不够用时触发
- 大对象进入老年代,没有连续空间分配给大对象会提前触发一次MajorGC进行垃圾回收腾出空间存放大对象
- 对MinorGC后晋升到老年代的大小大于老年代剩余的空间触发
- 手动调用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运行时内存工作过程相关推荐
- 深入理解java虚拟机一 JAVA运行时内存区域与class文件
一 JAVA运行时内存区域 JVM在加载class文件时,会将class文件定义的数据结构转为运行时内存中的数据,那么jvm是如何安排运行时的内存区域呢? jvm将运行时内存划分为以下几个部分: 堆: ...
- java运行时内存模型
运行时内存分为: 1.方法区 2.堆 3.虚拟机栈 4.本地方法栈 5.程序计数器 方法区.堆是共享的,所有线程都可以读取 虚拟机栈.本地方法栈.程序计数器是线程私有的,每个线程单独一套,它们在线程创 ...
- java运行时内存分配详解
一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私 ...
- 运行时常量池在哪里_Java虚拟机详解(二)------运行时内存结构
首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生 ...
- JVM运行时内存概念-堆栈及新生代、老年代、持久代
JVM内存有一些按不同标准划分的概念,这里来理清一下. 一.首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实 ...
- Java 内存管理、JVM 工作原理与 Java 运行时系统
Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...
- java执行内存_java运行时内存
运行时数据区域 java运行时数据区域主要分为下面几个: 方法区 虚拟机栈 本地方法栈 堆 程序计数器 java运行时数据区域.jpg 程序计数器 它是一块较小的内存空间,可以看做是当前线程所指定的字 ...
- Java 运行时的内存划分
Java 运行时的内存划分 程序计数器 记录当前线程所执行的字节码行号,用于获取下一条执行的字节码. 当多线程运行时,每个线程切换后需要知道上一次所运行的状态.位置.由此也可以看出程序计数器是每个线程 ...
- Java 虚拟机(JVM)运行时内存结构
1.PC Register(pc寄存器) Java虚拟机线程都有自己的pc寄存器.一条Java虚拟机线程只会同时执行一个方法的代码,这个方法称为该线程的当前方法.如果这个方法不是native的,那么p ...
最新文章
- python字符串的美化_Python构造自定义方法来美化字典结构输出
- php限制接口访问次数_php暂停多长时间后继续执行代码
- 【转】赶集网mysql开发36军规
- 洗车房,无人车的噩梦
- xcode6 使用MJRefresh
- 机器学习初探:Logistic选股模型实证
- 2013年放假安排时间表 法定节假日安排通知 ( IS2120@BG57IV3)
- python鲜花水果商城毕业设计开题报告
- 5.3 闪电网络的设计
- 我们该如何高效的学习
- 练习聚合函数的综合练习题
- SfxMCP基于GB28181/RTSP/ONVIF协议实现H5无插件直播方案 - sfxlab
- 量化分析师的Python日记【Q Quant兵器谱之偏微分方程3的具体金融学运用】
- 24点游戏python版
- dns 刷新本地DNS缓存的方法
- 基于WEB的高校校车管理系统设计与实现
- lenovo L480 进入bios_华硕 N56VZ N56 因bios导致 黑屏 不亮机 解决方案
- 正则基础之——捕获组(capture group)
- LaTeX - 排版试卷(一面双页)
- 使用ArcMap将CAD数据转shp