JVM,Java堆区、新生代、老年代,创建对象的内存分配,分代垃圾收集思想、堆区产生的错误

JVM堆区

    • 堆(Heap)
      • 堆区的组成:新生代+老年代
      • 堆空间的大小设置
      • 创建对象的内存分配
      • 堆区的分代垃圾收集思想
      • 堆区产生的错误

堆(Heap)

Heap堆区,用于存放对象实例和数组的内存区域

​ Heap堆区,是JVM所管理的内存中最大的一块区域,被所有线程共享的一块内存区域。堆区中存放内存实例,“几乎”所有的对象实例以及数组都在这里分配内存。
​ 每一个JVM进程值存在一个堆区,它在JVM启动时被创建,JVM规范中规定堆区可以是物理上不连续的内存,但必须是逻辑上连续的内存。

  1. 堆区是线程共享的区域,同时也是JVM管理最大的内存区域。
  2. JVM规范中描述,所有的对象实例及数组都应该在运行时分配在堆上。而他们的引用会被保存在虚拟机栈中,当方法结束时,这些实例不会被立即清除,而是等待GC垃圾回收。
  3. 由于堆占用内存大,所以是GC垃圾回收的重点区域,因此堆区也被称作GC堆。

对象逃逸分析
​ Java世界中“几乎”所有的对象都在堆中分配,但是,随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。
​ 从JDK 1.7开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存。

堆区的组成:新生代+老年代

​ 从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以JVM中的堆区旺旺进行分代划分,例如:新生代老年代。目的是更好地回收内存,或者更快地分配内存。

​ 堆区地组成分为新生代(Young Generation)、老年代(Old Generation)。新生代被分为伊甸区(Eden)和幸存区(from+to),幸存区又被分为Survivor 0(from)和Survior 1(to)。

​ 新生代和老年代的比例为1:2,伊甸区和s0、s1比例为8:1:1,不同区域存放对象的用途和方式不同:

  1. 伊甸区(Eden):存放大部分新创建对象。
  2. 幸存区(Survivor):存放Minor GC 之后,Eden区和幸存区(Servivor)本身没有被回收的对象。
  3. 老年代:存放Minor GC之后且年龄计算器达到15依然存活的对象、Major GC 和Full GC 之后仍然存活的对象。

在这里插入图片描述

堆空间的大小设置

堆空间的内存大小是可以修改的,默认情况下,初始堆内存为物理内存的1/64,最大为物理内存的1/4。

  • -Xms :设置初始堆内存,例如:-Xms64m
  • -Xmx :设置最大堆内存,例如:-Xmx64m
  • -Xmn :设置年轻代内存,例如: -Xmx32m

Heap堆区中的新生代、老年代的空间分配比例,通过java -xx:+PrintFlagsFinal -version命令查看:

在这里插入图片描述

上述输出结果分析:

InitialSurvivorRatio = 8

新生代Young(Eden/Survivor)空间的初始比例 = 8:代表Eden占新生代空间的80%

uintx NewRatio = 2

老年代Old/新生代Young的空间比例 = 2:代表老年代Old是新生代Young的2倍

因为新生代是由Eden + s0 + s1组成的,所以按照上述默认比例,如果Eden区内存大小是40M,那么两个Survivor区就是5M,整个新生代区就是50M,然后可以算出老年代Old区内存大小是100M,堆区总大小就是150M。

创建对象的内存分配

​ 创建一个新对象,在堆中的内存分配。

​ 大部分情况下,对象会在Eden区生成,当Eden区装填满的时候,会触发Young Garbage Collection,即YGC垃圾回收的时候,在Eden区实现清楚策略,没有被引用的对象则直接收回。

​ 依然存活的对象会被送到Survivor区。Survivor区分为s0和s1两块内存区域。每次YGC的时候,他们将存活的对象复制到未使用的Survivor空间(s0或s1),然后将当前正在使用的空间完全清除,交换两块空间的使用状态。每次交换时,对象的年龄会+1。

​ 如果YGC要移送的对象大于Survivor区容量的上限,则直接移交给老年代。一个对象不可能永远呆在新生代,在JVM中一个对象从新生代晋升到老年代的阈值默认值为15,可以在Survivor区交换14次之后,晋升到老年代。

在这里插入图片描述

堆区的分代垃圾收集思想

​ 处于效率的缘故,JVM的垃圾收集器不会对三个区域(伊甸区、幸存区、老年代)进行收集,大部分时候都是回收新生代,HotSpot虚拟机将垃圾收集分为部分收集(Partial GC)和整堆收集(Full GC)。

部分收集

  1. 新生代收集YGC(Minor GC/Young GC):回收新生代区域,频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收,性能耗费比较少。例如:Seriall、ParNew 、ParallelScavenge等垃圾收集器都是新生代收集;
  2. 老年代收集器Old GC(Major GC/Old GC):回收老年代区域,例如Serial Old、CMS、Parallel Old等垃圾收集器都是老年代收集;
  3. 混合收集(Mixed GC):收集整个年轻代区域及部分老年代区域,目前只有G1收集器有。

整堆收集FGC(Full GC):回收整个Java堆区,默认堆空间使用到达80%(可调整)的时候会触发FGC。

​ GC组合垃圾回收只有YGC和Full GC,Old GC不可以单执行。原因是OldGC是STW机制+标记整理算法,相对耗时只能在关键时刻使用,因此只有Full GC 才能触发Old GC。

GC垃圾回收的影响

GC耗时太长、GC次数太多会影响进程的性能,导致进程响应变慢,或者无法响应。

YGC耗时:耗时在几十或着几百毫秒属于征程情况,用户几乎无感知,对程序影响比较少。耗时太长或者频繁,会导致服务器超时问题。

YGC次数:太频繁,会降低服务的整体性能。高并发服务时,影响会比较大。

FGC次数:越少越好。比较正常情况几个小时一次、或者几天一次。

FGC耗时:耗时很长会导致线程频繁被停止,使应用响应变慢,比较卡顿。

产生FGC的原因:

  1. 大对象:系统一次加载了过多数据到内存中,导致大对象进入老年代。
  2. 内存泄露:频繁创建了大量对象,但是无法被回收(比如IO流对象使用后未调用close方法释放资源),先引发FGC,最后导致OOM。
  3. 程序频繁生成一些长生命周期的对象,当这些对象呢的存活年龄超过分代奈年龄时便会进入老年代,最后引发FGC。
  4. 程序BUG导致动态生成了很多新类,使得Metaspace不断被占用,先引发FGC,最后导致OOM。
  5. JVM参数设置不合理:包括内存大小、新生代和老年代的大小、Eden区和Survivor区的大小、元空间大小、垃圾回收算法等等。

堆区产生的错误

堆区最容易处出现的就是OutOfMemoeyError错误,这种错误的表现形式会有以下两种:

  1. OutOfMemoeyError:GC Overhead Limit Exceeded:当JVM花太多时间执行回收,并且只能回收很少的堆空间时,就会发生此错误。
  2. OutOfMemoryError:Java heap space:假如在创建新的对象时,堆空间中的空间不足以存放新创建的对象,就会引发此错误。

这种情况与配置的最大内存有关,且受制于物理内存的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2:通过props给组件传数据

一、业务场景 我们在使用Vue组件时,常常会复用Vue组件,那么,问题来了,复用的时候,业务数据不相同,怎么办了? 这里我们就需要学习新的属性:props来实现这个功能。 这样,组…

探寻未来卫生新境界:互联网公厕是什么意思

近年来,科技的飞速发展深刻改变了我们生活的方方面面,而公共卫生领域也在这场变革中迎来了一场前所未有的革命。在这个新时代,一个备受瞩目的概念逐渐崭露头角——那就是“互联网公厕”。这究竟意味着什么?是一场卫生革新的崛起&a…

swaggerUI不好用,试试这个openapiUI?

title: swaggerUI不好用,试试这个openapiUI? date: 2024-01-08 categories: [tool] tags: [openapi,工具] description: 基于swaggger2, openapi3规范的UI文档 1.背景 由于长期使用 swaggerUI 工具,它的轻量风格个人觉得还是不错的,但是它…

【漏洞复现】Hikvision SPON IP网络对讲广播系统存在命令执行漏洞CVE-2023-6895

漏洞描述 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。 Hikvision Intercom Broadcasting System是中国海康威视(Hikvision)公司的一个对讲广播系统。Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版…

vulhub中的Apache SSI 远程命令执行漏洞

Apache SSI 远程命令执行漏洞 1.cd到ssi-rce cd /opt/vulhub/httpd/ssi-rce/ 2.执行docker-compose up -d docker-compose up -d 3.查看靶场是否开启成功 dooker ps 拉取成功了 4.访问url 这里已经执行成功了,注意这里需要加入/upload.php 5.写入一句话木马 &…

微信预约小程序制作指南:从小白到专家

在当今的数字时代,微信小程序已经成为了一种非常流行的应用方式。预约功能更是成为了许多小程序的核心功能之一。如果你也想为你的小程序添加预约功能,以下步骤将会对你有所帮助。 一、进入乔拓云网后台 乔拓云网是一个在线小程序开发平台,你…

如何使用Docker部署开源CMF Drupal并结合cpolar内网穿透远程访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS,适用于各种不同的网站项目,从小型个人博客到大型企业级门户网站。它的学习…

【软考中级-软件设计师】day4:数据结构-线性表、单链表、栈和队列、串

大纲 线性结构 顺序存储和链式存储区别 单链表的插入和删除 真题 栈和队列 真题 串

kubectlkubeletrancherhelmkubeadm这几个命令行工具是什么关系?

背景 在最近学习k8s的过程中,发现kubectl&kubelet&rancher&helm&kubeadm这几个命令怎么在交错使用,他们究竟是什么关系?他们分别应该在什么情况下使用呢?这里我进行了简单的总结,做个区分。 各工具说…

性能分析与调优: Linux 实现 缺页剖析与火焰图

目录 一、实验 1.环境 2.缺页(RSS增长)剖析与火焰图 一、实验 1.环境 (1)主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter…

实现锚点定位功能(React/Vue)

前言 最近接到一个需求,修改某某页面,增加XXX功能,并实现个锚点功能。做产品就是不断优化,增加功能的过程。实现锚点的方式很多, 很多UI库也提供了组件,可以根据自己的需求调整一下组件库也可以实现&#…

vulhub中的Apache HTTPD 换行解析漏洞(CVE-2017-15715)详解

Apache HTTPD 换行解析漏洞(CVE-2017-15715) 1.cd到CVE-2017-15715 cd vulhub/httpd/CVE-2017-15715 2.运行docker-compose build docker-compose build 3.运行docker-compose up -d 4.查看docker-compose ps 5.访问 出现这个表示安装成功 6.漏洞复现…

Linux系统操作命令

Linux管理 在线查询Linux命令: https://www.runoob.com/linux/linux-install.htmlhttps://www.linuxcool.com/https://man.linuxde.net/ 1.Linux系统目录结构 Linux系统的目录结构是一个树状结构,每一个文件或目录都从根目录开始,并且根目…

MySQL语法练习-DML语法练习

文章目录 0、相关文章1、添加数据2、修改数据3、删除数据4、总结 0、相关文章 《MySQL练习-DDL语法练习》 1、添加数据 # 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...);# 给全部字段添加数据 insert into 表名 values(值1,值2,...);#批量…

Docker查看镜像的Dockerfile

前言 在使用Docker构建应用程序时,我们可以通过Dockerfile定义应用程序的环境,并将其打包成一个镜像。有时,我们可能需要查看一个已经构建好的镜像的Dockerfile,以了解镜像是如何构建的,或者进行后续的修改和调整。本…

python股票分析挖掘预测技术指标知识之蜡烛图指标(6)

本人股市多年的老韭菜,各种股票分析书籍,技术指标书籍阅历无数,萌发想法,何不自己开发个股票预测分析软件,选择python因为够强大,它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

利用格式工厂,做视频的剪辑

接到一个工作,一段视频中,需要抠除其中某一段 其实 剪映、苹果手机的视频编辑功能,都可以轻松搞定 只是清晰度会有损伤 而且对于太大的视频,苹果手机就没法处理了。 很多软件在导出高清视频时,需要会员收费&#xff0…

Java学习笔记-day02-在IDEA中使用git忽略提交.idea下的文件

1.在根目录.gitignore文件排除.idea目录 ### IntelliJ IDEA ### .idea2.使用重置Head还原已经add过的文件 创建项目时,可能会有.idea中的文件先add到git后再创建的.gitignore文件,导致文件commit时无法排除,如下所示。 使用重置Head将文件…

深度学习 常考简答题--[HBU]期末复习

目录 1.为什么要引用非线性激活函数? 2.什么是超参数?如何优化超参数? 3.线性回归通常使用平方损失函数,能否使用交叉熵损失函数? 4.平方损失函数为何不适用于解决分类问题?(和第3题一块复习) ​编辑 …

新年新风貌 苏州金龙蔚蓝公交护航高贸区“效率巴士”!

1月4日,由苏州市公交集团园区公司与园区高贸区管委会联合推出的4条“高贸区效率巴士”正式开行,这四条线路惠及包括苏州群策科技有限公司、荣旗工业科技有限公司等在内的20余家高贸区重点企业。线路开行5天来,效率巴士让不少企业员工感受到了…