热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java千百问_07JVM架构(007)_java堆内存是什么样的

点击进入_更多_Java千百问1.堆内存是什么样的了解jvm实例模型看这里:jvm实例的结构是什么样的了解java内存框架看这里:jvm是如何管理内存的了解堆栈的区别看这里:java堆

点击进入_更多_Java千百问

1.堆内存是什么样的

了解jvm实例模型看这里:jvm实例的结构是什么样的
了解java内存框架看这里:jvm是如何管理内存的
了解堆栈的区别看这里:java堆和栈有什么区别
每一个jvm实例都会被分配一个被所有线程共享堆内存空间,用来存放对象和数组,作为jvm的数据集中管理区,存取效率空间释放就成为了重中之重,jvm通过多区架构来完成这两个目标的达成。其结构如下:

这里写图片描述

2、什么是新生代

新生代(Young Generation)主要是用来存放新生的对象。

新生代又被进一步划分为Eden区(伊甸园区)和Survivor区(幸存区,包含空间相等的S0、S1区,或者说From、To区,没有先后顺序,是Copying算法的需要)。

大多数情况下,java中新建的对象都是在新生代上分配的,通过Copying算法来进行分配内存垃圾回收

了解堆的Copying算法看这里:什么是新生代的Copying算法

有两种情况下java新创建的对象会直接到旧生代

  1. 占用空间大的对象/数组,且对象中无外部引用的对象。

  2. 通过启动参数上面进行设置-XX:PretenureSizeThreshold=1024(单位是字节),如果对象超过此大小,就直接分配到旧生代。此外,并行垃圾回收器可以在运行期决定那些对象可以直接创建在旧生代。

了解垃圾回收机制看这里:java垃圾回收机制是什么
通过-Xmn设置新生代的大小,通过-XX:SurvivorRatio设置Eden区和Survivor区的比值,有些垃圾回收器会对S0或者S1进行动态的调整。

新生对象根据Copying算法Eden区/S0区或者Eden区/S1区中分配,Eden区的对象量达到阈值后,发生一次新生代GC

3、什么是老生代

老生代(Old Generation)主要存放应用程序中生命周期长的内存对象。

在新生代中经过多次垃圾回收仍然存活的对象,会被存放到老生代中。老生代通过标记/整理算法来清理无用内存。

多次回收之后仍然存活的对象,大小是-Xms减去-Xmn

老生代通过-XX:MaxTenuringThreshold设置最大年龄阈值,每个对象有“对象年龄计数器”,对象由新生代Eden区(伊甸园区)收集到Survivor区(幸存区)后,年龄+1。新生代垃圾清理(GC)后,年龄+1。依次,当年龄>=阈值后进入老生代。

对于年龄阈值有两中特殊情况:

  1. 如果在Survivor区(幸存区)中所有相同年龄对象占用了空间的一半以上,大于等于上述年龄的对象直接进入老生代。

  2. 占用空间大于-XX:PretenureSizeThreshold设定阈值的大对象(比如大的数组),会直接进入老生代。

4、什么是永久代

永久代(Permanent Generation)方法区,主要存放Class和Meta等永久保存的信息(如类、方法、字符串等)。

Class在被加载的时候被放入PermGen space区域。它和存放对象实例的堆内存不同,垃圾收集(GC)不会在主程序运行期对PermGen space进行清理,所以如果你的程序会加载了很多Class的话,就很可能出现PermGen space错误

这里要说明的是,以上的堆内存机构是Java 8之前的结构,在新版本的Java中有如下变化:

  • Java 7版本时把驻留字符串(intentd string)放到了老生代区。

  • Java 8中,永久代在堆中被移除,取而代之的是本地元空间,这与Oracle JRockit和IBM JVM类似,JVM也开始使用本地化的内存,来存放类的元数据。Java 8的堆内存结构如下:

这里写图片描述


推荐阅读
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 解析Java虚拟机HotSpot中的GC算法实现
    本文探讨了Java虚拟机(JVM)中HotSpot实现的垃圾回收(GC)算法,重点介绍了根节点枚举、安全点及安全区域的概念和技术细节,以及这些机制如何影响GC的效率和准确性。 ... [详细]
  • 贡献转移在计算每个元素的作用的时候,我们可以通过反向枚举作用效果,添加到作用元素的身上,这种方法叫做贡献转移。更正式的说, ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 本文深入探讨了动态赋值的概念及其在编程实践中的应用,特别是通过Java代码示例来展示如何利用循环结构动态地为数组分配值。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 本文详细探讨了在Windows 98环境下安装Apache 1.3.9、JServ、GNUJSP 1.0、JDK 1.2.2及JSDK 2.0后遇到的中文显示问题,并提供了多种有效的解决方案。 ... [详细]
  • Excel技巧:单元格中显示公式而非结果的解决方法
    本文探讨了在Excel中如何通过简单的方法解决单元格显示公式而非计算结果的问题,包括使用快捷键和调整单元格格式两种方法。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
author-avatar
姚姚姚YTLLL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有