非常详细GC学习笔记

VBA解决Excel批处理任务之:批量修改Sheet名称 针对需要批量处理大量的Sheet改名的场景,使用VBA是非常便捷的方式。 简单介绍几种方法: 1. 录制宏法: 录制宏是用Excel自带的工具把改名改成一个可以复制操作的动作。 这里选择录制,会弹出一个宏设置窗口: 这里设置好宏名称就好,然后确定就可以开始录制你的操作。操作完成之后,再进入到宏窗口点击结束录制: 这样就可以通过执行来运行了,运行方法: 1. 通过选择宏: ... 阅读详情

GC学习笔记

这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里。

一、GC特性以及各种GC的选择

1、垃圾回收器的特性

2、对垃圾回收器的选择

2.1 连续 VS. 并行

2.2 并发 VS. stop-the-world

2.3 压缩 VS. 不压缩 VS. 复制

二、GC性能指标

三、分代回收

四、J2SE 5.0的HotSpot JVM上的GC学习 - 分代、GC类型、快速分配

五、J2SE 5.0的HotSpot JVM上的GC学习 - SerialGC

六、J2SE 5.0的HotSpot JVM上的GC学习 - ParallelGC

七、J2SE 5.0的HotSpot JVM上的GC学习 - ParallelCompactingGC

八、J2SE 5.0的HotSpot JVM上的GC学习 - CMS GC

九、启动参数学习示例

 

1. GC特性以及各种GC的选择 

1.1 垃圾回收器的特性

该回收的对象一定要回收,不该回收的对象一定不能回收 

一定要有效,并且要快!尽可能少的暂停应用的运行 

需要在时间,空间,回收频率这三个要素中平衡 

内存碎片的问题(一种解决内存碎片的方法,就是压缩) 

可扩展性和可伸缩性(内存的分配和回收,不应该成为跑在多核多线程应用上的瓶颈) 

对垃圾回收器的选择

1.2 连续 VS. 并行

连续垃圾回收器,即使在多核的应用中,在回收时,也只有一个核被利用。

但并行GC会使用多核,GC任务会被分离成多个子任务,然后这些子任务在各个CPU上并行执行。

并行GC的好处是让GC的时间减少,但缺点是增加了复杂度,并且存在产生内存碎片的可能。

1.3 并发 VS. stop-the-world

当使用stop-the-world 方式的GC在执行时,整个应用会暂停住的。

而并发是指GC可以和应用一起执行,不用stop the world。

一般的说,并发GC可以做到大部分的运行时间,是可以和应用并发的,但还是有一些小任务,不得不短暂的stop the world。

stop the world 的GC相对简单,因为heap被冻结,对象的活动也已经停止。但缺点是可能不太满足对实时性要求很高的应用。

相应的,并发GC的stop the world时间非常短,并且需要做一些额外的事情,因为并发的时候,对象的引用状态有可能发生改变的。

所以,并发GC需要花费更多的时间,并且需要较大的heap。

1.4 压缩 VS. 不压缩 VS. 复制

在GC确定内存中哪些是有用的对象,哪些是可回收的对象之后,他就可以压缩内存,把拥有的对象放到一起,并把剩下的内存进行清理。

在压缩之后,分配对象就会快很多,并且内存指针可以很快的指向下一个要分配的内存地址。

一个不压缩的GC,就原地把不被引用的对象回收,他并没有对内存进行压缩。好处就是回收的速度变快了;缺点呢,就是产生了碎片。

一般来说,在有碎片的内存上分配一个对象的代价要远远大于在没有碎片的内存上分配。

另外的选择是使用一个复制算法的GC,他是把所有被引用的对象复制到另外一个内存区域中。

使用复制GC的好处就是,原来的内存区域,就可以被毫无顾忌的清空了。但缺点也很明显,需要更多的内存,以及额外的时间来复制。

 

2. GC性能指标 

几个评估GC性能的指标

吞吐量      应用花在非GC上的时间百分比 

GC负荷    与吞吐量相反,指应用花在GC上的时间百分比 

暂停时间   应用花在GC stop-the-world 的时间 

GC频率     顾名思义 

Footprint   一些资源大小的测量,比如堆的大小 

反应速度   从一个对象变成垃圾道这个对象被回收的时间 

一个交互式的应用要求暂停时间越少越好,然而,一个非交互性的应用,当然是希望GC负荷越低越好。

一个实时系统对暂停时间和GC负荷的要求,都是越低越好。

一个嵌入式系统当然希望Footprint越小越好。

3. 分代回收 

3.1 什么是分代 

当使用分代回收技术,内存会被分为几个代(generation)。也就是说,按照对象存活的年龄,把对象放到不同的代中。

使用最广泛的代,应属年轻代和年老代了。

根据各种GC算法的特征,可以相应的被应用到不同的代中。 

研究发现:

大部分的对象在分配后不久,就不被引用了。也就是,他们在很早就挂了。 

只有很少的对象熬过来了。 

年轻代的GC相当的频繁,高效率并且快。因为年轻代通常比较小,并且很多对象都是不被引用的。

如果年轻代的对象熬过来了,那么就晋级到年老代中了。如图:

通常年老代要比年轻代大,而且增长也比较慢。所以GC在年老代发生的频率非常低,不过一旦发生,就会占据较长的时间。

3.2 总结

年轻代通常使用时间占优的GC,因为年轻代的GC非常频繁 

年老代通常使用善于处理大空间的GC,因为年老代的空间大,GC频率低 

4. J2SE 5.0的HotSpot JVM上的GC学习 - 分代、GC类型、快速分配 

J2SE5.0 update 6 的HotSpot上有4个GC。

4.1 HotSpot上的分代

分成三部分:年轻代、年老代、永久代

很多的对象一开始是分配在年轻代的,这些对象在熬过了一定次数的young gc之后,就进入了年老代。同时,一些比较大的对象,一开始就可能被直接分配到年老代中(因为年轻代比较小嘛)。

4.2 年轻代

年轻代也进行划分,划分成:一个Eden和两个survivor。如下图:

大部分的对象被直接分配到年轻代的eden区(之前已经提到了是,很大的对象会被直接分配到年老代中),

survivor区里面放至少熬过一个YGC的对象,在survivor里面的对象,才有机会被考虑提升到年老代中。

同一时刻,两个survivor只被使用一个,另外一个是用来进行复制GC时使用的。

4.3 GC类型

年轻代的GC叫young GC,有时候也叫 minor GC。年老代或者永久代的GC,叫 full GC,也叫major GC。

也就是说,所有的代都会进行GC。

一般的,首先是进行年轻代的GC,(使用针对年轻代的GC),然后是年老代和永久代使用相同的GC。如果要压缩(解决内存碎片问题),每个代需要分别压缩。

有时候,如果年老区本身就已经很满了,满到无法放下从survivor熬出来的对象,那么,YGC就不会再次触发,而是会使用FullGC对整个堆进行GC(除了CMS这种GC,因为CMS不能对年轻代进行GC)

4.4 快速分配内存

多线程进行对象建立的时候,在为对象分配内存的时候,就应该保证线程安全,为此,就应该进入全局锁。但全局锁是非常消耗性能的。

为此,HotSpot引入了Thread Local Allocation Buffers (TLAB)技术,这种技术的原理就是为每个线程分配一个缓冲,用来分配线程自己的对象。

每个线程只使用自己的TLAB,这样,就保证了不用使用全局锁。当TLAB不够用的时候,才需要使用全局锁。但这时候对锁的时候,频率已经相当的低了。

为了减少TLAB对空间的消耗,分配器也想了很多方法,平均来说,TLAB占用Eden区的不到1%。

5. J2SE 5.0的HotSpot JVM上的GC学习 - SerialGC 

5.1 串行GC

 串行GC,只使用单个CPU,并且会stop the world。

5.1.1 young 的串行GC

如下图: 

 

当发生ygc的时候,Eden和From的survivor区会将被引用的对象复制到To这个survivor种。

如果有些对象在To survivor放不下,则直接升级到年老区。

当YGC完成后,内存情况如下图: 

5.1.2 old区的串行GC

年老区和永久区使用的是Mark-Sweep-Compact的算法。

mark阶段是对有引用的对象进行标识

sweep是对垃圾进行清理

compact对把活着的对象进行迁移,解决内存碎片的问题

如下图:

5.2 何时使用串行收集器

串行GC适用于对暂停时间要求不严,在客户端下使用。

5.3 串行收集器的选择 

在J2SE5.0上,在非 server 模式下,JVM自动选择串行收集器。

也可以显示进行选择,在java启动参数中增加: -XX:+UseSerialGC 。

6. J2SE 5.0的HotSpot JVM上的GC学习 - ParallelGC 

6.1 并行GC

现在已经有很多java应用跑在多核的机器上了。

并行的GC,也称作吞吐量GC,这种GC把多个CPU都用上了,不让CPU再空转。

6.2 YGC的并行GC

YGC的情况,还是使用stop-the-world + 复制算法的GC。

只不过是不再串行,而是充分利用多个CPU,减少GC负荷,增加吞吐量。

如下图,串行YGC和并行YGC的比较:

6.3 年老区的并行GC

也是和串行GC一样,在年老区和永久区使用Mark-Sweep-Compact,利用多核增加了吞吐量和减少GC负荷。

6.4 何时使用并行GC

对跑在多核的机器上,并且对暂停时间要求不严格的应用。因为频率较低,但是暂停时间较长的Full GC还是会发生的。

6.5 选择并行GC

在server模式下,并行GC会被自动选择。

或者可以显式选择并行GC,加启动JVM时加上参数: -XX:UseParallelGC

7. J2SE 5.0的HotSpot JVM上的GC学习 - ParallelCompactingGC 

7.1 Parallel Compacting GC

parallelCompactingGC是在J2SE5.0 update6 引入的。

parallel compacting GC 与 parallel GC的不同地方,是在年老区的收集使用了一个新的算法。并且以后,parallel compacting GC 会取代 parallem GC的。

7.2 YGC的并行压缩GC

与并行GC使用的算法一样:stop-the-world 和 复制。

7.3 年老区的并行压缩GC

他将把年老区和永久区从逻辑上划分成等大的区域。

分为三个阶段:

标记阶段,使用多线程对存在引用的对象进行并行标记。 

分析阶段,GC对各个区域进行分析,GC认为,在经过上次GC后,越左边的区域,有引用的对象密度要远远大于右边的区域。所以就从左往右分析,当某个区域的密度达到一个值的时候,就认为这是一个临界区域,所以这个临界区域左边的区域,将不会进行压缩,而右边的区域,则会进行压缩。 

压缩阶段,多各个需要压缩的区域进行并行压缩。 

7.4 什么时候使用并行压缩GC

同样的,适合在多核的机器上;并且此GC在FGC的时候,暂停时间会更短。

可以使用参数 -XX:ParallelGCThreads=n 来指定并行的线程数。

7.5 开启并行压缩GC

使用参数 -XX:+UseParallelOldGC

8. J2SE 5.0的HotSpot JVM上的GC学习 - CMS GC 

8.1 Concurrent mark sweep GC

很多应用对响应时间的要求要大于吞吐量。

YGC并不暂停多少时间,但FGC对时间的暂用还是很长的。特别是在年老区使用的空间较多时。

因此, HotSpot引入了一个叫做CMS的收集器,也叫低延时收集器。

8.2 CMS的YGC

与并行GC同样的方式: stop-the-world 加上 copy。

8.3 CMS的FGC

CMS的FGC在大部分是和应用程序一起并发的!

CMS在FGC的时候,一开始需要做一个短暂的暂停,这个阶段称为最初标记:识别所有被引用的对象。

在并发标记时候,会和应用程序一起运行。

因为并发标记是和程序一起运行的,所以在并发标记结束的时候,不能保证所有被引用的对象都被标记,

为了解决这个问题,GC又进行了一次暂停,这个阶段称为:重标识(remark)。

在这个过程中,GC会重新对在并发标阶段时候有修改的对象做标记。

因为remark的暂停要大于最初标记,所以在这时候,需要使用多线程来并行标记。

在上述动作完成之后,就可以保证所有被引用的对象都被标记了。

因此,并发清理阶段就可以并发的收集垃圾了。

下图是serial gc 和 CMS gc 的对比:

因为要增加很多额外的动作,比如对被引用的对象重新标记,增加了CMS的工作量,所以他的GC负荷也相应的增加。

CMS是唯一没有进行压缩的GC。如下图:

没有压缩,对于GC的过程,是节约了时间。但因此产生了内存碎片,所以对于新对象在年老区的分配,就产生了速度上的影响,

当然,也就包括了对YGC时间的影响了。

CMS的另一个缺点,就是他需要的堆比较大,因为在并发标记的时候和并发清除的时候,应用程序很有可能在不断产生新的对象,而垃圾又还没有被删除。

另外,在最初标记之后的并发标记时,原先被引用的对象,有可能变成垃圾。但在这一次的GC中,这是没有被删除的。这种垃圾叫做:漂流垃圾。

最后,由于没有进行压缩,由此而带来了内存碎片。

为了解决这个问题,CMS对热点object大小进行了统计,并且估算之后的需求,然后把空闲的内存进行拆分或者合并来满足后续的需求。

与其他的GC不同,CMS并不在年老区满了之后才开始GC,他需要提前进行GC,用以满足在GC同时需要额外的内存。

如果在GC的同时,内存不能满足要求了,则GC就变成了并行GC或者串行GC。

为了防止这种情况,会根据上一次GC的统计来确定启动时间。

或者是当年老区超过初始容量的话,CMS GC就会启动。

初始容量的设置可以在JVM启动时增加参数: -XX:CMSInitiatingOccupancyFraction=n

n是一个百分比,默认值为68。

总之,CMS比并行GC花费了更少的暂停时间,但是牺牲了吞吐量,以及需要更大的堆区。

8.4 额外模式

为了防止在并发标记的时候,GC线程长期占用CPU,CMS可以把并发标记的时候停下来,把cpu让给应用程序。

收集器会想并发标记分解成很小的时间串任务,在YGC之间来执行。

这个功能对于机器的CPU个数少,但又想降低暂停时间的应用来说,非常有用。

8.5 何时使用CMS

当CPU资源较空闲,并且需要很低的暂停时间时,可以选择CMS。比如 web servers。

8.6 选择CMS

选择CMS GC: 增加参数 -XX:UseConcMarkSweepGC

开启额外模式: 增加参数 -XX:+CMSIncreamentalMode

9. 结合线上启动参数学习

线上的启动参数

-Dprogram.name=run.sh -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dcom.sun.management.config.file=/home/admin/web-deploy/conf/jmx/jmx_monitor_management.properties -Djboss.server.home.dir=/home/admin/web-deploy/jboss_server -Djboss.server.home.url=file\:/home/admin/web-deploy/jboss_server -Dapplication.codeset=GBK -Ddatabase.codeset=ISO-8859-1 -Ddatabase.logging=false -Djava.endorsed.dirs=/usr/alibaba/jboss/lib/endorsed

 

其中:

-Xmx2g -Xms2g 表示堆为2G 

-Xmn256m 表示新生代为 256m 

-Xss256k 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右

-XX:PermSize=128m 表示永久区为128m 

-XX:+DisableExplicitGC 禁用显示的gc,程序程序中使用System.gc()中进行垃圾回收,使用这个参数后系统自动将 System.gc() 调用转换成一个空操作

-XX:+UseConcMarkSweepGC 表示使用CMS 

-XX:+CMSParallelRemarkEnabled 表示并行remark 

-XX:+UseCMSCompactAtFullCollection 表示在FGC之后进行压缩,因为CMS默认不压缩空间的。 

-XX:+UseCMSInitiatingOccupancyOnly 表示只在到达阀值的时候,才进行CMS GC

-XX:CMSInitiatingOccupancyFraction=70 设置阀值为70%,默认为68%。 

-XX:+UseCompressedOops JVM优化之压缩普通对象指针(CompressedOops),通常64位JVM消耗的内存会比32位的大1.5倍,这是因为对象指针在64位架构下,长度会翻倍(更宽的寻址)。对于那些将要从32位平台移植到64位的应用来说,平白无辜多了1/2的内存占用,这是开发者不愿意看到的。幸运的是,从JDK 1.6 update14开始,64 bit JVM正式支持了 -XX:+UseCompressedOops 这个可以压缩指针,起到节约内存占用的新参数.

关于-XX:+UseCMSInitiatingOccupancyOnly 和 -XX:CMSInitiatingOccupancyFraction ,详细解释见下:

The concurrent collection generally cannot be sped up but it can be started earlier.

A concurrent collection starts running when the percentage of allocated space in the old generation crosses a threshold. This threshold is calculated based on general experience with the concurrent collector. If full collections are occurring, the concurrent collections may need to be started earlier. The command line flag CMSInitiatingOccupancyFraction can be used to set the level at which the collection is started. Its default value is approximately 68%. The command line to adjust the value is

-XX:CMSInitiatingOccupancyFraction=<percent>

The concurrent collector also keeps statistics on the promotion rate into the old generation for the application and makes a prediction on when to start a concurrent collection based on that promotion rate and the available free space in the old generation. Whereas the use of CMSInitiatingOccupancyFraction must be conservative to avoid full collections over the life of the application, the start of a concurrent collection based on the anticipated promotion adapts to the changing requirements of the application. The statistics that are used to calculate the promotion rate are based on the recent concurrent collections. The promotion rate is not calculated until at least one concurrent collection has completed so at least the first concurrent collection has to be initiated because the occupancy has reached CMSInitiatingOccupancyFraction . Setting CMSInitiatingOccupancyFraction to 100 would not cause only the anticipated promotion to be used to start a concurrent collection but would rather cause only non-concurrent collections to occur since a concurrent collection would not start until it was already too late. To eliminate the use of the anticipated promotions to start a concurrent collection set UseCMSInitiatingOccupancyOnly to true.

-XX:+UseCMSInitiatingOccupancyOnly

关于内存管理完整详细信息,请查看这份文档:http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf

Claude Code 100个真实案例 - 用AI设计Arduino PCB电路板(硬件小白也能画板) 本案例展示如何使用 Claude Code 配合 KiCad 的 Python 脚本接口,从零设计一块 Arduino 传感器扩展板 PCB。从原理图符号创建、网表生成到 PCB 布局布线,全程自动化完成,最终输出可直接发给工厂打样的 Gerber 文件。 阅读详情

相关推荐

标准恢复二极管整流器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

报告页数: 150 图表数: 100 报告价格:¥16800 本文研究全球与中国市场标准恢复二极管整流器的发展现状及未来发展趋势,分别从生产和消费的角度分析标准恢复二极管整流器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。 主要生产商包括: Yangzhou Yangjie Vishay Intertechnology Power Semiconductors Inc Nexperia B

Fj69258的博客 5848

为什么jvm 提交的内存比实际进程占用的内存更大

RSS:常驻内存集,为进程分配的内存大小,包括共享库的内存,不包括进入交换分区的内存,这里RSS就是实际进程占用的内存。 used Heap: jvm中活动对象占用的内存,当used 接近committed的时候,heap就会grow up,-Xmx设置了Commit上限。 Commited: 表示可供java虚拟机使用的内存量,提交的内存可能会随时间的推移而变化(增加或者减少)。J...

weixin_30793643的博客 2932

基于CODESYS与EtherCAT的步进电机单轴控制实践

本文详细介绍了基于CODESYS平台与EtherCAT总线技术实现步进电机单轴控制的完整实践流程。从硬件选型、软件工程创建、EtherCAT主从站配置,到运动控制功能块编程与在线调试,手把手指导读者完成从零到一的搭建,并提供了常见问题的排坑指南,帮助自动化开发者快速掌握这一高效、灵活且成本可控的工业运动控制解决方案。

hh234的博客 491

【基础篇】十、JVM堆 && 直接内存

运行时数据区域,还有两组成部分:堆和方法区,和栈、程序计数器不同,它们是线程共享的。

llg___的博客 1341

Polars简明基础教程一:Polars快速入门

在这个例子中,我们将添加一个列,其中包含每个舱位中乘客的最大年龄。在Python中(而不是特指Polars),当我们将代码包裹在括号中时,我们可以在新行上调用一个新方法——在这种情况下是select。在这里,我们看到一个使用表达式API的简单示例,其中我们在select语句中选择Pclass、Name和Age列(我们将在第3节中深入了解select语句)。表达式是一个函数,它接受一个Series(或DataFrame中的列)作为输入,并返回一个Series(或DataFrame中的列)。

sosogod的博客 3877

MuMu模拟器过检测实战:从硬件伪装到API欺骗的完整避坑指南

本文详细介绍了MuMu模拟器过检测的实战技术,从硬件伪装到API欺骗的全方位解决方案。通过修改CPU/GPU信息、内存分布、系统属性和行为模拟等关键技术,帮助用户有效绕过现代应用的模拟器检测机制,提升模拟器的隐蔽性和稳定性。

xxx12的博客 1384

一次jvm导致线上内存占用过高问题定位

背景:8G物理内存,8核CPU,jvm使用的G1垃圾回收器。 问题:线上内存占用告警,内存占用超过85%,且现象一直持续。 分析 看一下jvm启动参数配置: -Xms6144m -Xmx6144m -Xss256k -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+DisableExplicitGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof -XX:+PrintGCD

yzh_1346983557的博客 6533

【第33话:车辆控制】自动驾驶车辆运动学模型推导及详解

自动驾驶车辆的运动学模型以自行车模型为核心,通过状态方程。

一碗白开水一 830

.NET 某智能服装智造系统 内存泄漏分析

二:Windbg 分析 到底是哪一方面的泄漏 根据朋友描述,程序运行一段时间后,内存就炸了,应该没造成人员伤亡,不然也不会跟我wx聊天了,这里可以用 .time 看看当前的 process 跑了多久。 0:000> .time Debug session time: Thu Oct 21 14:54:39.000 2021 (UTC + 8:00) System Uptime: 6 days 4:37:27.851 Process Uptime: 0 days 0:40:14.000 Kernel

weixin_45032957的博客 355

AI安全护栏评测:TrustedExecBench如何量化评估大模型防护能力

在人工智能和机器学习领域,模型安全对齐是确保AI系统可靠、可控的核心技术。其原理是通过设计安全机制(即“护栏”)来约束模型行为,防止生成有害、偏见或越界内容。这项技术的核心价值在于平衡AI能力与风险管控,是可信AI部署的基石。应用场景广泛覆盖内容审核、对话系统、代码生成等需要人机交互的领域。本文聚焦的TrustedExecBench项目,正是针对“护栏”性能量化评估这一痛点,提供了一个标准化、自动化的开源评测框架。该工具通过构建多维度的恶意测试套件,并引入基于模型的动态评判机制,能够系统性地检验大语言模型在

weixin_42525428的博客 378

【思考模型框架】MECE原则,确保分析时,考虑到的所有因素,既不重叠又无遗漏

MECE原则,是Mutually Exclusive and Collectively Exhaustive的缩写,中文译为“相互独立、完全穷尽”。MECE原则,这是一种逻辑思维和组织信息的方法,旨在确保分析时既没有遗漏也没有重复。MECE原则,相互独立、完全穷尽(Mutually Exclusive,Collectively Exhaustive)的原则MECE原则,确保分析时考虑到的所有因素既不重叠又无遗漏。

奶爸的编程之路,也就一周冷个三天 2751

jvm学习笔记(GC,分代思想,TLAB),一文轻松搞定

其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象在一块,就如同把学校的人都关在一个教室,GC的时候要找到哪些对象没用,这样就会对堆的所有区域进行扫描,而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。1.当年轻代空间不足时,就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC(每次Minor GC 会清理年轻代的内存)

1166

高空抛物监控系统:基于YOLOv8的轨迹追踪与可视化系统

本文详细介绍了一种基于YOLOv8深度学习模型的高空抛物监控系统,该系统能够实时检测并追踪高层建筑抛掷物的运动轨迹。文章包含完整的系统设计思路、算法实现细节、数据集构建方法以及基于PyQt5的可视化界面开发过程。我们提供了完整的Python实现代码,并讨论了系统的性能优化策略和实际部署考量。此外,我们还推荐了几个公开可用的高空抛物数据集,并详细分析了系统的应用前景和技术挑战。

YOLO 446

gc2053驱动学习笔记

用于计算像素速率,表示单位时间内输出的像素数量。通过设备树获取摄像头模块索引,摄像头模块方向,摄像头模块名称,摄像头镜头名称,摄像头外部时钟,复位,上电,下电的gpio引脚。.hdr_mode enum HDR 模式(如 NO_HDR, HDR_2EXP 等).hdr_mode enum HDR 模式(如 NO_HDR, HDR_2EXP 等)

1464

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Lua 源码学习笔记(4)GC

Lua 源码学习笔记(4)GC 参考书籍:《Lua设计与实现》 作者书籍对应Github:https://github.com/lichuang/Lua-Source-Internal 云风的 BLOG,Lua GC 的工作原理:https://blog.codingnow.com/2018/10/lua_gc.html 云风的 BLOG,Lua GC 的源码剖析 (1):https://blo...

l773575310的博客 612

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

GC学习笔记

GC学习笔记 这是我公司同事的GC学习笔记,写得蛮详细的,由浅入深,循序渐进,让人一看就懂,特转到这里。 一、GC特性以及各种GC的选择 1、垃圾回收器的特性 2、对垃圾回收器的选择 2.1 连续 VS. 并行 2.2 并发 VS. stop-the-world 2.3 压缩 VS. 不压缩 VS. 复制 二、GC性能指标 三、分代回收

lucca的专栏 286

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jvm minor gc,major gc ,full gc学习笔记

1 minor gc,major gc ,full gc jvm 在进行gc时,并非每次都对上面的上内存(新生代,老年代,方法区)区域一起回收,大部分回收的都是指新生代 对于hotspot vm 实现,它里面的gc按照回收区域分为两大类型:一种是部分收集(partial gc),一种是整堆收集(Full Gc)。 部分收集 新生代收集(Minor gc / young gc):只是新生代的垃圾收集 老年代收集(Major gc / old gc):只是老年代的垃圾收集 整堆收集(Full gc

ytsydmx的博客 819
上一篇: AWK笔记
下一篇: 编写SHELL时需要注意空格
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值