JVM堆空间
一、堆空间的核心概述
一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。
堆内存的大小是可以调节的。堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(ThreadLocal Allocation Buffer,TLAB)。所有的对象实例以及数组都应当在运行时分配在堆上。
数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。堆是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域
二、内存细分:

三、设置堆内存大小与OOM
Java堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,可以通过选项"-Xmx"和"-Xms"来进行设置。
-Xms用于表示堆区的起始内存,等价于-XX:InitialHeapSize
-Xmx则用于表示堆区的最大内存,等价于-XX:MaxHeapSize
一旦堆区中的内存大小超过“-Xmx"所指定的最大内存时,将会抛出OutOfMemoryError异常
通常会将-Xms和-Xmx两个参数配置相同的值,其目的是为了能够在iava垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小,从而提高性能。
默认情况下,初始内存大小:物理电脑内存大小/64
最大内存大小:物理电脑内存大小/4

四、年轻代与老年代:
存储在JVM中的Java对象可以被划分为两类:
一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速
另外一类对象的生命周期却非常长,在某些极端的情况下还能够与的生命周期保持一致。
Java堆区进一步细分的话,可以划分为年轻代(YoungGen)和老年代(OldGen)
其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间(有时也叫做from区、to区)

在HotSpot中,Eden空间和另外两个Survivor空间缺省所占的比例是8:1:1
开发人员可以通过选项-XX:SurvivorRatio调整这个空间比例。比如-XX:SurvivorRatio=8
几乎所有的Java对象都是在Eden区被new出来的,绝大部分的Java对象的销毁都在新生代进行的
可以使用选项"-Xmn"设置新生代最大内存大小
五、图解对象分配过程:
为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。
(1).new的对象先放伊甸园区。此区有大小限制。
(2).当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区
(3).然后将伊甸园中的剩余对象移动到幸存者0区。
(4).如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区。
(5).如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区
(6).啥时候能去养老区呢?可以设置次数。默认是15次,可以设置参数-XX:MaxTenuringThreshold=<N>
(7).在养老区,相对悠闲,当养老区内存不足时,再次触发GC(Major GC),进行养老区的内存清理
(8).若养老区执行了Major GC之后发现依然无法进行对象的保存,就会产生OOM异常
总结:
针对幸存区s0,s1区的总结:复制之后有交换,谁空谁是to
关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集
六、Minor GC、Major GC与Full GC的区别:
JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。针对HotSpotVM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)
1.部分收集:
不是完整收集整个Java堆的垃圾收集。其中又分为:
新生代收集(Minor GC/Young GC):只是新生代的垃圾收集
老年代收集(Major GC/Old GC):只是老年代的垃圾收集
目前,只有CMSGC会有单独收集老年代的行为,注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。只有G1 GC会有这种行为
2.整堆收集(Full GC):收集整个java堆和方法区的垃圾收集
年轻代GC(Minor Gc)触发机制:
当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC。(每次Minor GC会清理年轻代的内存);因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。这一定义既清晰又易于理解。Minor GC会引发STW,暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行
老年代GC(MajorGC/Full GC)触发机制:
指发生在老年代的GC,对象从老年代消失时,我们说“Major GC”或“Full GC”发生了。出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程);也就是在老年代空间不足时,会先尝试触发Minor GC。如果之后空间还不足,则触发Major GC.Major GC的速度一般会比Minor GC慢10倍以上,STW的时间更长;如果Major GC后,内存还不足,就报OOM了。
Full GC触发机制:
触发Full GC 执行的情况有如下五种:
a.调用System.gc()时,系统建议执行Full GC,但是不必然执行
b.老年代空间不足
c.方法区空间不足
d.通过Minor GC后进入老年代的平均大小大于老年代的可用内存
e.由Eden区、survivor space0(From Space)区向survivor space1(To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
说明:full gc是开发或调优中尽量要避免的。这样暂时时间会短一些
相关文章:
JVM堆空间
一、堆空间的核心概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。堆可以处于物理上不连续的内存空间中ÿ…...
《深入解析:DOS检测的技术原理与方法》
DDOS入侵检测与防御 一、实现Linux下DDOS的入侵检测与防御 利用Python编程实现对wrk的泛洪攻击检测,并让程序触发调用Linux命令实现防御: 1、泛洪攻击的检测,可以考虑使用的命令,这些命令可以通过Python进行调用和分析 (1) netstat -ant …...
PID如何调试,如何配置P,I,D值,如何适配pwm的定时器配置,如何给小车配电源
首先你要搞清楚PID公式原理 PID算法解析PID算法解析_pid滤波算法-CSDN博客 然后你要明白调试原理 首先要确定一个电源 电源决定了你后面调试时电机转动速度大小和pwm占空比的关系,电源电压越大那要转到同一速度所需的占空比越小,反之电源电压越小那要…...
小马模拟器-第三方全街机游戏模拟器
链接:https://pan.xunlei.com/s/VOHSiB6st-f3RWlIK01MS2fUA1?pwd44v7# 1.小马模拟器是一款完全免费的游戏模拟器软件,支持街机(FBA,MAME,PGM2),3DS,WII,NGC,DC,SS,DOS,MD,WSC,NDS,JAVA,PCE,FC,SFC,GBA,GBC,PSP,PS,N64等多种游戏…...
Qwen2-VL:在任何分辨率下增强视觉语言模型对世界的感知 (大型视觉模型 核心技术 分享)
摘要 我们推出了Qwen2-VL系列,这是对之前Qwen-VL模型的高级升级,重新定义了视觉处理中的常规预设分辨率方法。Qwen2-VL引入了Naive Dynamic Resolution机制,使模型能够动态地将不同分辨率的图像转换为不同的视觉令牌数量。这种方法允许模型生成更高效和准确的视觉表示,紧密…...
微信小程序date picker的一些说明
微信小程序的picker是一个功能强大的组件,它可以是一个普通选择器,也可以是多项选择器,也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…...
MySQL 基础学习(2): INSERT 操作
在这篇文章中,我们将专注于 MySQL 中的 INSERT 操作,深入了解如何高效地向表中插入数据,并探索插入操作中的一些常见错误与解决方案。 一、基础 INSERT 语法 在 MySQL 中,INSERT 操作用于向表中插入新记录,基本语法如…...
关于opensips的帮助命令的解释
opensips -help以下是 opensips 命令及其选项的中文解释(基于 3.6.0-dev 版本): 命令用法 opensips -l 地址 [-l 地址 ...] [选项]选项说明 选项功能-f 文件指定配置文件(默认为 /usr/local//etc/opensips/opensips.cfg&#x…...
新项目传到git步骤
1.首先创建远程仓库,创建一个空白项目,即可生成一个克隆URL,可以是http也可以是SSH,copy下这个地址 2.找到项目的本机目录,进入根目录,打开git bash here命令行 3.初始化: git init 4.关联远程地址: git remote add origin "远程仓库的URL" 5.查看关联 git re…...
【力扣每日一题】LeetCode 2412: 完成所有交易的初始最少钱数
LeetCode 2412: 完成所有交易的初始最少钱数 题目解析 问题描述 给定一个二维数组 transactions,每个元素 transactions[i] [costi, cashbacki] 表示一个交易。对于每笔交易,要求你完成该交易时有足够的初始资金 money,并且交易会减少或增…...
【算法】递归型枚举与回溯剪枝初识
递归型枚举与回溯剪枝初识 1.枚举子集2.组合型枚举3.枚举排列4.全排列问题 什么是搜索?搜索,是一种枚举,通过穷举所有的情况来找到最优解,或者统计合法解的个数。因此,搜索有时候也叫作暴搜。搜索一般分为深度优先搜索…...
pytorch 多机多卡训练方法
在深度学习训练中,使用多机多卡(多台机器和多块 GPU)可以显著加速模型训练过程。 PyTorch 提供了多种方法来实现多机多卡训练,以下是一些常用的方法和步骤: 1. 使用 torch.distributed 包 PyTorch 的 torch.distribut…...
InfiniBand客户端注册机制详解:ib_register_client函数的作用与实现
在Linux内核的InfiniBand(IB)子系统中,ib_register_client函数扮演着至关重要的角色。它允许上层用户(如特定的IB设备驱动程序或相关应用模块)注册为IB客户端,并定义在IB设备添加或移除时应执行的回调函数。这一机制确保了IB设备的动态管理,以及资源的有效分配和回收。本…...
rocketmq-product-send方法源码分析
先看有哪些send方法 首先说红圈的 有3个红圈。归类成3种发送方式。假设前提条件,发送的topic,有3个broker,每个broker总共4个write队列,总共有12个队列。 普通发送。负载均衡12个队列。指定超时时间指定MessageQueue,发送&#…...
centos下设置服务器开机自启动 redis
在客户服务器中,服务器重启,发现 Redis 没有重启, 可以按照类似的步骤来创建自启动脚本,并将它添加到定时任务中。 解决办法: 1. 创建自启动脚本 进入服务器并创建脚本文件,例如 /usr/local/bin/redis_…...
【Linux】APT 密钥管理:官方推荐的解决方案应对 apt-key 弃用
引言 在 Ubuntu 和 Debian 系统中,apt-key 命令用于管理 GPG 密钥,验证来自软件包存储库的包是否合法并且未被篡改。然而,从 Debian 11 和 Ubuntu 22.04 开始,apt-key 被弃用,并将在未来的版本中完全移除。因此&#…...
69.在 Vue 3 中使用 OpenLayers 拖拽实现放大区域的效果(DragPan)
引言 在现代 Web 开发中,地图功能已经成为许多应用的重要组成部分。OpenLayers 是一个功能强大的开源地图库,支持多种地图源和交互操作。Vue 3 是一个流行的前端框架,以其响应式数据和组件化开发著称。本文将介绍如何在 Vue 3 中集成 OpenLa…...
77,【1】.[CISCN2019 华东南赛区]Web4
有句英文,看看什么意思 好像也可以不看 进入靶场 点击蓝色字体 我勒个豆,百度哇 所以重点应该在url上,属于任意文件读取类型 接下来该判断框架了 常见的web框架如下 一,Python 框架 1.Flask URL 示例 1:http://…...
手撕B-树
一、概述 1.历史 B树(B-Tree)结构是一种高效存储和查询数据的方法,它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…...
SQL 指南
SQL 指南 引言 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库系统的标准计算机语言。自1970年代问世以来,SQL已经成为了数据库管理和数据操作的事实标准。本文旨在为初学者和有经验的数据库用户提供一个全面的SQL指南,涵盖SQL的基础知识、高级…...
一文简单回顾复习Java基础概念
还是和往常一样,我以提问的方式回顾复习,今天回顾下Java小白入门应该知道的一些基础知识 Java语言有哪些特点呢? Java语言的特点有: 面向对象,主要是封装、继承、多态;平台无关性,“一次编写…...
Git上传了秘钥如何彻底修改包括历史记录【从安装到实战详细版】
使用 BFG Repo-Cleaner 清除 Git 仓库中的敏感信息 1. 背景介绍 在使用 Git 进行版本控制时,有时会不小心将敏感信息(如 API 密钥、密码等)提交到仓库中。即使后续删除,这些信息仍然存在于 Git 的历史记录中。本文将介绍如何使用…...
GCC之编译(8)AR打包命令
GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…...
Linux二进制部署K8s集群的平滑升级教程
一、升级前的准备工作 备份集群配置和数据 备份/etc/kubernetes/目录,其中包含Kubernetes集群的配置文件。 备份/var/lib/etcd/目录,其中存储了etcd数据库的数据。 使用etcdctl工具备份etcd数据: bash复制 ETCDCTL_API3 etcdctl snapshot s…...
2.1.3 第一个工程,点灯!
新建工程 点击菜单栏左上角,新建工程或者选择“文件”-“新建工程”,选择工程类型“标准工程”选择设备类型和编程语言,并指定工程文件名及保存路径,如下图所示: 选择工程类型为“标准工程” 选择主模块机型&#x…...
图像处理算法研究的程序框架
目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架,如下图所示 在该框架中,将图像处…...
计算机工程:解锁未来科技之门!
计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展,计算机技术已经深深渗透到我们生活的方方面面,从医疗、金融到教育,无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业,计算机技术的应用尤为突出。比如&a…...
Linux初识——基本指令(2)
本文将继续从上篇末尾讲起,讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move(移动)的缩写,其功能为:1.剪切文件、目录。2.重命名 先演示下重命名,假设我想把当前目录下的di34改成dir5 那…...
单片机-STM32 WIFI模块--ESP8266 (十二)
1.WIFI模块--ESP8266 名字由来: Wi-Fi这个术语被人们普遍误以为是指无线保真(Wireless Fidelity),并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词,Wi-Fi还出现在ITAA的一个论文中。…...
[C++技能提升]类注册
最近在做AI信息在各个平台流转的框架设计,想要设计一种可以灵活扩展、不改变原有代码的框架,了解到了类注册。 具体需求是这样的:AI算法在客户本地电脑和云端都有部署,原先AI在这两个平台下的输出格式并不统一,且每个…...
