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

news2024/9/21 12:25:30

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.coloradmin.cn/o/1367309.html

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

相关文章

腾讯云免费服务器申请1个月攻略,亲测可行教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

基于动物迁徙算法优化的Elman神经网络数据预测 - 附代码

基于动物迁徙算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于动物迁徙算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于动物迁徙优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

软件测试|深入理解SQL CROSS JOIN:交叉连接

简介 在SQL查询中,CROSS JOIN是一种用于从两个或多个表中获取所有可能组合的连接方式。它不依赖于任何关联条件,而是返回两个表中的每一行与另一个表中的每一行的所有组合。CROSS JOIN可以用于生成笛卡尔积,它在某些情况下非常有用&#xff…

内网穿透的应用-使用Net2FTP轻松部署本地Web网站并公网访问管理内网资源

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…

New!2024最新ChatGPT提示词开源项目:GPT Prompts Hub - 专注于深化对话质量和探索更复杂的对话结构

🌟 GPT Prompts Hub 🌟 欢迎来到 “GPT Prompts Hub” 存储库!探索并分享高质量的 ChatGPT 提示词。培养创新性内容,提升对话体验,激发创造力。我们极力鼓励贡献独特的提示词。 在 “GPT Prompts Hub” 项目中&#…

勒索病毒威胁揭秘:.faust勒索病毒如何威胁你的数据安全

导言: 随着网络犯罪的不断演变,.360勒索病毒作为一种恶意软件威胁,给用户的数据安全带来了严重的挑战。本文91数据恢复将深入介绍.360勒索病毒的特征、如何恢复被其加密的数据文件的方法,并提供一系列预防措施,以降低…

46 WAF绕过-信息收集之反爬虫延时代理池技术

目录 简要本章具体内容和安排缘由简要本课具体内容和讲课思路简要本课简要知识点和具体说明演示案例:Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CC总结: Aliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分析绕过-…

java.lang.NoSuchFieldError: No static field xxx of type I in class

问题描述 将Library编译成 aar导入到另一个项目中依赖成功,编译成功,运行打开发生了崩溃异常如下图: 原因分析: 异常错误提示找不到id为recycler_1的控件了,我的Library中recycler_1控件是在MainActivity的xml中使用的&#xff0c…

一文搞定JMM核心原理

公众号《鲁大猿》,寻精品资料,帮你构建Java全栈知识体系 www.jiagoujishu.cn (架构技术.cn) JMM引入 从堆栈说起 JVM内部使用的Java内存模型在线程栈和堆之间划分内存。 此图从逻辑角度说明了Java内存模型: # 堆栈里…

鸿蒙开发解决agconnect sdk not initialized. please call initialize()

文章目录 项目场景:问题描述原因分析:解决方案:总结:项目场景: 鸿蒙开发报错: agconnect sdk not initialized. please call initialize() 问题描述 报错内容为: 10-25 11:41:01.152 6076-16676 E A0c0d0/JSApp: app Log: 数据查询失败: {“code”:1100001,“messag…

ArcGIS小技巧|四种计算图斑面积的方法

ArcGIS中有多种方法可计算出图斑面积,本文总结了四种方法,是否可堪称史上最全? 1、计算几何 这是最适合非专业人士的方法,直接利用ArcGIS中的计算几何功能进行计算。 a、首先添加一double类型字段,用来存储面积数值…

ip协议历史

今天的互联网,是万维网(WWW)一家独大。而在上世纪七八十年代,人们刚开始尝试网络连接时,那时出现了计算机科学研究网络、ALOHA 网、因时网、阿帕网等不同类型的网络,这些网络之间互相通信是个难题。 于是&…

YOLOv8改进 | 主干篇 | CSWinTransformer交叉形窗口网络

一、本文介绍 本文给大家带来的改进机制是CSWin Transformer,其基于Transformer架构,创新性地引入了交叉形窗口自注意力机制,用于有效地并行处理图像的水平和垂直条带,形成交叉形窗口以提高计算效率。它还提出了局部增强位置编码(LePE),更好地处理局部位置信息,我将其…

【Matplotlib】基础设置之图例处理05

标签 import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt%matplotlib inlinelegend() 函数被用来添加图像的标签,其主要相关的属性有: legend entry - 一个 legend 包含一个或多个 entry,一个 entry 对应一个 k…

百亿储能企业「鹏辉能源」发来感谢信,携手企企通打造的采购供应链平台成功上线

近日,由企企通携手百亿储能上市企业【广州鹏辉能源科技股份有限公司】(以下简称“鹏辉能源”)打造的一站式数字化采购供应链管理平台成功上线。为感谢企企通在企业采购数字化升级过程中所做的贡献和努力,鹏辉能源向企企通团队发来…

腾讯云com域名注册1元条件说明

腾讯云com域名注册优惠价格1元首年,条件是企业新用户,个人新用户注册com域名是33元首年,第二年续费价格85元一年。活动 txybk.com/go/domain-sales 活动打开如下图: 腾讯云com域名注册优惠价格 腾讯云com域名注册原价是85元一年&a…

mysql最常见问题:允许远程访问和修改密码 的详细解决方法

目 录 一、不能通过navicat等数据库客户端远程访问 (一)问题 (二)解决方法:开启远程可访问 1、输入授权命令的方式 2、直接更改数据库中的用户表 二、修改数据库的密码 Mysq在Lin…

R语言(12):绘图

12.1 创建图形 12.1.1 plot函数 plot(c(1,2,3),c(1,2,4)) plot(c(1,2,3),c(1,2,4),"b") plot(c(-3,3),c(-1,5),"n",xlab "x",ylab "y")12.1.2 添加线条&#xff1a;abline()函数 x <- c(1,2,3) y <- c(1,3,8) plot(x,y) lm…

2023年生成式AI全球使用报告

生成式人工智能工具正在迅速改变多个领域&#xff0c;从营销和新闻到教育和艺术。 这些工具使用算法从大量培训材料中获取新的文本、音频或图像。虽然 ChatGPT 和 Midjourney 之类的工具可以用来实现超出人类能力或想象力的艺术效果&#xff0c;但目前它们最常用于比人类更轻松…

Codeforces Round 646 (Div. 2) C. Game On Leaves

题目链接&#xff1a;Problem - 1363C - Codeforces 题意&#xff1a;给定一颗树和一个节点x&#xff0c;每次从这棵树上删除一个叶子节点及其任何一条连接的边&#xff0c;Ayush先手&#xff0c;问谁先取到节点x。 博弈论问题&#xff0c;先看两个样例是如何取到的。 对于样例…