Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 内存中对象的分配与回收。

JDK1.8之前的堆内存示意图:

从上图可以看出堆内存分为新生代、老年代和永久代。新生代又被进一步分为:Eden 区+Survivor1 区+Survivor2 区。值得注意的是,在 JDK 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域(永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制)。

1.对象优先在eden区分配

目前主流的垃圾收集器都会采用分代回收算法,因此需要将堆内存分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

大多数情况下,对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时,虚拟机将发起一次Minor GC.下面我们来进行实际测试以下。

在测试之前我们先来看看 Minor GC和Full GC 有什么不同呢?

  • 新生代GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快。
  • 老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC经常会伴随至少一次的Minor GC(并非绝对),Major GC的速度一般会比Minor GC的慢10倍以上。

2.大对象直接进入老年代

大对象就是需要大量连续内存空间的对象(比如:字符串、数组)。

为什么要这样呢?

为了避免为大对象分配内存时由于分配担保机制带来的复制而降低效率。

3.长期存活的对象将进入老年代

既然虚拟机采用了分代收集的思想来管理内存,那么内存回收时就必须能识别哪些对象应放在新生代,哪些对象应放在老年代中。为了做到这一点,虚拟机给每个对象一个对象年龄(Age)计数器。如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中,并将对象年龄设为1.对象在 Survivor 中每熬过一次 MinorGC,年龄就增加1岁,当它的年龄增加到一定程度(默认为15岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。

4 动态对象年龄判定

为了更好的适应不同程序的内存情况,虚拟机不是永远要求对象年龄必须达到了某个值才能进入老年代,如果 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无需达到要求的年龄。

转载于:https://www.cnblogs.com/Dream-chasingGirl/p/10351575.html

java虚拟机之内存分配相关推荐

  1. java虚拟机手动内存分配_《深入理解java虚拟机》-垃圾收集器与内存分配策略

    如何判断对象已死? 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器减1:其中计数器为0的对象是不可能再被使用的已死对象. 引用计数算法的实现很简单 ...

  2. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  3. 独占设备的分配与回收_灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?...

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 作者 l Hollis JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈. ...

  4. 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 222 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) JVM内存结构,是很 ...

  5. Java虚拟机自动内存管理

    生活规律告诉我们,在享受便利的同时一般都会付出巨大的代价,如果你在享受了便利的同时,还没有为此付出代价,不是说明没有,只是还没到付出的时候.试问,有哪个Java系统架构师不懂Java虚拟机?纵观Jav ...

  6. 深入理解java虚拟机【内存溢出实例】

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

  7. 深入理解Java虚拟机2——内存管理机制及工具

    一.内存区域与内存溢出异常 1. Java虚拟机的运行时数据区: ----------------------------------- 运行时区域 方法区 虚拟机栈 本地方法栈 堆 程序计数器 -- ...

  8. 学习笔记【Java 虚拟机④】内存模型

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  9. Java虚拟机的内存空间有几种

    Java虚拟机的内存空间有几种?(1)问题分析: JVM(虚拟机)的内存划分 不同的数据使用的是哪一块内存空间 (2)核心答案讲解: Java虚拟机有那几块内存空间: 1)栈内存:方法运行时所进入的内 ...

最新文章

  1. 威纶通宏开机后使用初始化宏指令_【操作系统】我们按下电脑开机键的背后发生了什么?...
  2. 一篇适合新手的深度学习综述
  3. 我的家乡网页设计_Graphic Design|康石石浅谈LOGO设计在作品集中的创作方法
  4. python编程培训多少钱-python培训一般多少钱?[python培训]
  5. other-如何可以查看别人请求的输出结果
  6. [译] 关于Angular的变更检测(Change Detection)你需要知道这些
  7. 数据结构讲义代码堆和栈、多线程、多进程、网络编程
  8. AE进度条读取动画插件 LoadUP 1.71
  9. python语言中包含的标准数据类型_Python标准数据类型
  10. Linux 词典安装
  11. ALAsset 循环获取图片(Assets Library Framework)
  12. vuex commit 模块_分享一个Vuex的使用的新姿势
  13. oracle ebs工单入库,ORACLE-EBS_库存功能点操作模块.doc
  14. 什么是ipo表,ipo图,hipo图
  15. 【Redis系列】Redis 入门指南
  16. List集合去重的常见及常用的四种方式
  17. vnc远程控制软件下载,四款神级能够下载的vnc远程控制软件
  18. 您的Mac已成功加入Wi-Di网络,但是无法访问互联网问题及解决方案
  19. iOS菜鸟笔记4:一个简单的TableView
  20. Android屏幕保护KeyguardManager相关内容学习

热门文章

  1. 安卓APP_ 布局(3) —— FrameLayout帧布局
  2. tp5 php7 报500,记一次TP单元测试报500错误的问题
  3. linux vim ctags,Linux环境上代码阅读与编写的利器-vim+ctags+cscope
  4. redis钟setnx命令
  5. SQLServer常用的日期和时间函数梳理
  6. java如何改注释_关于Java:更改字符串值的注释
  7. windows比linux差在哪,怎么让新手理解Linux比Windows好在哪里!
  8. mysql安装教程8.0.21安装,Windows系统下MySQL8.0.21安装教程(图文详解)
  9. 用符号方法求下列极限或导数matlab,matlab实验
  10. 响应式网格项目动画布局_响应式网格及其实际使用方式:常见的UI布局