热门标签 | 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 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 本文介绍了安全性要求高的真正密码随机数生成器的概念和原理。首先解释了统计学意义上的伪随机数和真随机数的区别,以及伪随机数在密码学安全中的应用。然后讨论了真随机数的定义和产生方法,并指出了实际情况下真随机数的不可预测性和复杂性。最后介绍了随机数生成器的概念和方法。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
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社区 版权所有