java垃圾回收,看懂这一篇面试就过了

Java的垃圾回收算法详解 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一个至关重要的概念,它负责自动管理内存,释放不再使用的对象所占用的空间,从而防止内存泄漏和溢出。另外,我们还可以使用Java的内存分析工具(如MAT、VisualVM等)来查看和分析堆内存的使用情况,找出潜在的内存泄漏和溢出问题。虽然垃圾回收算法本身是由Java虚拟机(JVM)内部实现的,我们无法直接通过代码来展示其工作原理,但我们可以通过一些示例代码来演示如何观察和分析垃圾回收的行为。 阅读详情

垃圾回收

背景

Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾。
C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的 allocated,然后不停的析构。
于是,有人就提出,能不能写一段程序实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢?
1960 年,基于 MIT 的 Lisp 首先提出了垃圾回收的概念,而这时 Java 还没有出世呢!所以实际上 GC 并不是 Java 的专利,GC 的历史远远大于 Java 的历史!

内存分配

先看一下java内存分配的流程图,什么时间才会发生yongGC,什么时间会发生内存溢出,什么时间发生fullGC
在这里插入图片描述
这里可以结合一段代码来看实际的内存回收情况,代码如下:

public class AllocationTest {

  private static final int _1MB = 1024 * 1024;

  /**
   * VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
   */
  public static void testAllocation() {
    byte[] allocation1, allocation2, allocation3, allocation4, allocation5;
    allocation1 = new byte[2 * _1MB];
    allocation2 = new byte[2 * _1MB];
    allocation3 = new byte[2 * _1MB];
    allocation4 = new byte[4 * _1MB];//出现一次Minor GC
    allocation5 = new byte[5 * _1MB]; // 堆内存溢出
  }

  /**
   *VM参数:-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:SurvivorRatio=8
   *-XX:PretenureSizeThreshold=3145728
   */
  public static void testPretenureSizeThreshold () {
    byte[] allocation;
    allocation = new byte[4 * _1MB];//直接分配在老年代中
  }

  public static void main(String[] args) {
    testAllocation();
//    testPretenureSizeThreshold();
  }
}

需要设置启动时JVM参数:
方法testAllocation:-verbose:gc表述输出虚拟机内GC详细信息,-xms20M设置启动时内存20M,-Xmx堆内存最大20M,-Xmn堆内新生代的大小为10M,XX:+PrintGCDetails与-verbose:gc表示的意义一样,都是输出GC详细信息设置一个即可,-XX:SurvivorRatio=8表示设置Eden区与Survivor区的比值,默认值为8,也就是说Eden区为8,Survivor区为1,Survivor区一共有两个,所以新生代内存被平均分成了10份,Eden区占去了8,s1占去了1,S2占去了1。

方法解析:创建5个空的byte数组,前三个new了一个大小为2M的对象,Eden区内存8M,已被占用6M,allocation4创建对象的时候,Eden已经放不下了,是时候MinorGC了,先将一部分存活对象放到S1中,发现放不下,只能放到老年代了,然后就放到老年代了6M,然后Eden又new了4M之后,在创建allocation5时,5M已经超过了Eden区一半的大小,所以属于大对象,就要往老年代里放,发现也放不下,然后就爆内存溢出了。
下边是方法执行的结果

[GC (Allocation Failure) [DefNew: 6289K->820K(9216K), 0.0043434 secs] 6289K->4916K(19456K), 0.0044060 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew (promotion failed) : 7204K->6407K(9216K), 0.0027041 secs][Tenured: 6861K->6861K(10240K), 0.0023662 secs] 11300K->10982K(19456K), [Metaspace: 224K->224K(4480K)], 0.0051184 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
[Full GC (Allocation Failure) [Tenured: 6861K->6844K(10240K), 0.0013907 secs] 10982K->10965K(19456K), [Metaspace: 224K->224K(4480K)], 0.0014196 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 def new generation   total 9216K, used 4488K [0x05000000, 0x05a00000, 0x05a00000)
  eden space 8192K,  54% used [0x05000000, 0x05462298, 0x05800000)
  from space 1024K,   0% used [0x05800000, 0x05800000, 0x05900000)
  to   space 1024K,   0% used [0x05900000, 0x05900000, 0x05a00000)
 tenured generation   total 10240K, used 6844K [0x05a00000, 0x06400000, 0x06400000)
   the space 10240K,  66% used [0x05a00000, 0x060af320, 0x060af400, 0x06400000)
 Metaspace       used 225K, capacity 2280K, committed 2368K, reserved 4480K
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.yonyou.gc.memory.AllocationTest.testAllocation(AllocationTest.java:20)
	at com.yonyou.gc.memory.AllocationTest.main(AllocationTest.java:34)

从结果可以看出,发生了两次minorGC,第一次是在allocation4对象创建的时候,将Eden区由6M回收到了820K,对象都放到了老年代,第二次发生在allocation5创建的时候,发生了promotion failed,意思是新生代放不下了,对象直接放到了老年代,然后后边因为老年代也放不下5M了,紧接着又发生了FullGC,FullGC完了对象依然放不下,就内存溢出了。

判断垃圾

引用计数

在这里插入图片描述
引用计数法固然是好呀,简单高效,不需要暂停应用程序就可以知道“所有的垃圾”,直接清理就可以了,但是回到上面的图你会发现,引用计数存在很严重的内存问题,就是循环引用的对象,他并不能视他为垃圾,这种对象就永远不会被回收,会造成严重的内存泄露,所以java在1.2之后就弃用了这种方式。

可达性分析

在这里插入图片描述

GCroot指的是什么呢?
在这里插入图片描述

  • 虚拟机栈中引用的对象(本地变量表)
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中引用的对象(Native Object)

Stop-the-world

在这里插入图片描述

误报的话,最多就是浪费了一次回收的机会,下次回收继续回收就可以了

在这里插入图片描述
但是如果漏报,线程2引用的对象会被垃圾回收掉,严重的可能导致整个程序崩溃,所以就需要在识别垃圾的时候停下所有线程,即Stop the world.

引用类型

引用类型功能特点
强引用 (Strong Reference)被强引用关联的对象永远不会被垃圾收集器回收掉
软引用 (Soft Reference)软引用关联的对象,只有当系统将要发生内存溢出时,才会去回收软引用引用的对象
弱引用 (Weak Reference)只被弱引用关联的对象,只要发生垃圾收集事件,就会被回收
虚引用 (Phantom Reference)被虚引用关联的对象的唯一作用是能在这个对象被回收器回收时收到一个系统通知
强引用

只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

    Object obj = new Object();
弱引用
    Object obj = new Object();
    SoftReference<Object> sf = new SoftReference<Object>(obj);

GC算法

回收算法类型优点缺点
标记清除算法(Mark-Sweep)不需要移动对象,简单高效标记-清除过程效率低,GC产生内存碎片
复制算法(Copying)简单高效,不会产生内存碎片内存使用率低,且有可能产生频繁复制问题
标记-整理算法(Mark-Compact)综合了前两种算法的优点仍需要移动局部对象
分代收集算法(Generational Collection)分区回收对于长时间存活对象的场景回收效果不明显,甚至起到反作用

标记清除算法

在这里插入图片描述

先标记出存货对象,及可回收对象,再从内存中清除对象。优点:简单高效。缺点:容易造成内存碎片化,比如说内存回收之后,断断续续的。假如要分配一个较大对象,需要在内存中寻找一块儿连续的内存空间,会发现找不到~可能报内存溢出了。

复制算法

在这里插入图片描述

复制算法,就是将存活的对象复制到另外一块儿干净的连续的内存空间里,另外一块儿直接清除。优点:解决了内存碎片化的问题。缺点:始终有一块儿内存空间被闲置,不能有效的利用有限的内存空间。

标记整理算法

在这里插入图片描述

标记整理算法弥补了复制算法的缺点。将清除后的内存空间进行整理压缩,存活对象放在连续的内存空间内,又解决了内存碎片化的问题。缺点也很明显,就是压缩及对象的移动对性能的损耗相当大,影响系统的吞吐量。

分代回收

在这里插入图片描述

综合以上算法衍生出的分代回收,将新生代跟老年代分开处理,为什么要这么做呢IBM 公司的专业研究表明,有将近 98% 的对象是朝生夕死,所以针对这一现状,大多数情况下,对象会在新生代 Eden 区中进行分配。所以就将大部分的对象在新生代就回收掉,新生代采用了复制算法,即提高了系统的吞吐,又避免了内存碎片化的问题,老年代采用标记整理的算法,充分利用老年代的空间。

垃圾回收器

回收器类型回收算法特点设置参数
Serial New/Serial Old回收器复制算法/标记-整理算法单线程复制回收,简单高效,但会暂停程序导致停顿-XX:+UseSerialGC(年轻代、老年代回收器为:Serial New、Serial Old)
ParNew New/ParNew Old回收器复制算法/标记-整理算法多线程复制回收,降低了停顿时间,但容易增加上下文切换-XX:+UserParNewGC(年轻代、老年代回收器为:ParNew New、Serial Old, JDK1.8中无效) -XX:+UseParallelOldGC(年轻代、老年代回收器为:Parallel Scavenge、Parallel Old)
Parallel Scavenge回收复制算法并行回收器,追求高吞吐量,高效利用CPU-XX:+UseParallelGC(年轻代、老年代回收器为:Parallel Scavenge、Serial Old) -XX:ParallelGCThreads=4(设置并发线程)
CMS回收器标记-清理算法老年代回收器,高并发、低停顿,追求最短GC回收停顿时间,CPU占用较高,响应时间快,停顿时间短-XX:+UserConcMarkSweepGC(年轻代、年老带回收器为:ParNew New、CMS(Serial Old作为备用))
G1回收器标记-整理+复制算法高并发、低停顿,可预测停顿时间-XX:+UseG1 GC(年轻代、老年代回收器为:G1、G1) -XX:MaxGCPauseMillis=200 (设置最大停顿时间)

在这里插入图片描述

GC调优

GCEasy

并发10,10000请求 GCEasy结果

在这里插入图片描述

10并发100000请求,1G内存

在这里插入图片描述

回收调优

  1. 降低 Minor GC 频率
    2、降低 Full GC 的频率

2.1、减少创建大对象

2.2、增大堆内存空间

2.3、选择合适的 GC 回收器

响应时间优先的应用 :尽可能设大,直到接近系统的最低响应时间限制 (根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
吞吐量优先的应用 :尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。

垃圾回收统计信息

-XX:+PrintGC虚拟机启动后,只要遇到GC就会打印日志

-XX:+PrintGCDetails 查看详细信息,包括各个区的情况

-XX:+PrintGCTimeStamps 可以将时间和日期也加到GC日志中。表示自JVM启动至今的时间戳

-XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间.可与上面混合使用

-XX:+PrintGCDateStamps 每一行就添加上了绝对的日期和时间。(以日期的形式,如 2013-05-04T21:53:59.234+0800)

-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息

-Xloggc:…/logs/gc.log 日志文件的输出路径

-XX:+PrintTLAB 查看TLAB空间的使用情况

JVM参数

堆参数
-Xms20M,-XX:InitialHeapSize简写 表示设置堆容量的最小值为20M,必须以M为单位

-Xmx20M -XX:MaxHeapSize简写,表示设置堆容量的最大值为20M,必须以M为单位。将-Xmx和-Xms设置为一样可以避免堆自动扩展,减少程序运行时的垃圾回收次数,从而提供性能。大的项目-Xmx和-Xms一般都要设置到10G、20G甚至还要高

所有JVM关于初始\最大堆内存大小的输出都是使用它们的完整名称:“InitialHeapSize”和“InitialHeapSize”。所以当你查询一个正在运行的JVM的堆内存大小时,如使用-XX:+PrintCommandLineFlags参数或者通过JMX查询,应该寻找“InitialHeapSize”和“InitialHeapSize”标志而不是“Xms”和“Xmx”

稳定的堆大小能减少gc次数,但是每次gc时间增加
震荡的堆大小能增加gc次数,但是每次gc时间减少
-XX:MinHeapFreeRatio 最小空闲比例,当堆空间空闲内存小于这个比例,则扩展
-XX:ManHeapFreeRatio 最大空闲比例,当堆空间空闲内存大于这个比例,则压缩
-Xms和-Xmx相等时,上面的参数失效

-XX:+HeapDumpOnOutOfMemoryError 使得JVM在产生内存溢出时自动生成堆内存快照

-XX:HeapDumpPath= 改变默认的堆内存快照生成路径,可以是相对或者绝对路径

-XX:OnOutOfMemoryError 当内存发生溢出时 执行一串指令-XX:OnOutOfMemoryError =“sh ~/cleanup.sh”

-XX:PermSize 设置永久代的初始大小

-XX:MaxPermSize 设置永久代的最大大小

-Xmn 或 -XX:NewSize 设置新生代的初始大小

新生代只是堆的一部分 新生代越大老年代越小,一般不允许新生代比老生代还大。考虑到GC最坏的情况 新生代全部复制到老生代会产生OOM错误,这个参数对系统性能以及GC行为有很大影响,新生代大小一般会设置整个堆空间的1/3到1/4左右

-XX:NewRatio 设置新生代和老生代的相对大小。优点是新生代大小会随着整个堆大小动态扩展

不同的堆分布情况对系统执行都会产生不一样的影响,实际配置的基本策略就是尽可能将对象预留在新生代,减少老年代的GC次数。

-XX:SurvivorRatio 设置新生代中eden空间和from/to空间的比例,eden/to=eden/from

-XX:+PrintTenuringDistribution 指定JVM在每次新生代GC时 输出Survivor中对象的年龄分布

-XX:InitialTenuringThreshold 设置老年代阈值的初始值

-XX:MaxTenuringThreshold 设置新生代阈值的最大值(垃圾最大年龄),默认为15。如果设置为0的话,则新生代对象不经过Survivor区,直接进入老年代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则新生代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在新生代即被回收的概念。
另外,大对象(新生代eden区无法装入时,也会直接进入老年代)。

-XX:PretenureSizeThreshold 设置对象的大小超过指定的大小后,直接进入老年代,但是要注意TLAB区域优先分配空间的原则

TLAB 全称Thread Local Allocation Buffer,即线程本地分配缓存,从名字上看是一个线程专用的内存分配区域,是为了加速对象分配而生的。每一个线程都会产生一个TLAB,该线程独享的工作区域,java虚拟机使用这种TLAB区来避免多线程冲突问题,提高了对象分配的效率。TLAB空间一般不会太大,当大对象无法在TLAB分配时,则会直接分配到堆上。

-XX:+NeverTenure 对象永远不会晋升到老年代(当不需要老生代的时候可以这样设置)

-XX:+AlwaysTenure 表示没有Survivor区 对象会直接被移动到老年代中

TLAB

-XX:+UserTLAB 使用TLAB

-XX:+TLABSize 设置TLAB大小

-XX:+TLABRefllWasteFraction 设置维护进入TLAB空间的单个对象大小,他是一个比例值,默认为64,即如果对象大于整个空间的1/64,则在堆中创建对象。

-XX:+PrintTLAB 查看TLAB信息

-XX:+ResizeTLAB 自调整TLABRefllWasteFraction阀值

-XX:TLABWasteTargetPercent TLAB占eden区的百分比

栈参数

-Xss5m 指定线程的最大栈空间,整个参数也直接决定了函数可调用的最大深度

方法区参数

-XX:PermSize=10M 表示JVM初始分配的永久代的容量,必须以M为单位

-XX:MaxPermSize=10M 表示JVM允许分配的永久代的最大容量,必须以M为单位,大部分情况下这个参数默认为64M

方法区,又称永久区,默认情况下-XX:PermSize=64M,如果系统运行时生产大量的类,就需要设置一个相对合适的方法区,以免出现永久区内存溢出的问题

直接内存参数

-XX:MaxDirectMemorySize=128m 直接内存最大容量,M单位,默认为64M

如果不设置默认值为最大堆空间,即-Xmx。直接内存使用达到上限时,就会触发垃圾回收,如果不能有效的释放空间,也会引起系统的OOM

其他

-XX:+UseFastAccessorMethods 原始类型的快速优化

-XX:+DisableExplicitGC 关闭System.gc()

-XX:+AggressiveOpts 加快编译

-XX:+UseBiasedLocking 锁机制的性能改善

-Xnoclassgc 禁用垃圾回收

收集器设置

收集器设置:
-XX:+UseSerialGC 新生代串行(Serial),老年代串行(Serial Old)

-XX:+UseParNewGC 新生代并行(ParNew),老年代串行(Serial Old)

-XX:+UseConcMarkSweepGC 新生代并行(ParNew),老年代串行(CMS),备份(Serial Old)

-XX:+UseParallelGC 新生代并行吞吐(Parallel Scavenge),老年代串行(Serial Old)

-XX:+UseParalledlOldGC 新生代并行吞吐(Parallel Scavenge),老年代并行吞吐(Parallel Old)

并行收集器设置

-XX:ParallelGCThreads=n 设置并行收集器收集时使用的CPU数。并行收集线程数。一般最好和计算机的CPU相当

-XX:MaxGCPauseMillis=n 设置并行收集最大暂停时间

-XX:GCTimeRatio=n 设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

-XX:+CMSIncrementalMode 设置为增量模式。适用于单CPU情况。

-XX:ParallelGCThreads=n 设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

Java面试题:GC垃圾回收机制 GC垃圾回收(Garbage Collection的简称):当需要分配的内存空间不再使用的时候,JVM将调用垃圾回收机制来回收不再使用的内存空间。系统级线程跟踪存储空间的分配情况。并在JVM的空闲时,检查并释放那些可被释放的存储空间。在程序运行中会不断地创建很多的对象,这些对象数据会占用系统内存,如果得不到有效的管理,内存的占用会越来越多,甚至会出现内存溢出的情况,所以需要对内存进行合理地释放,这个时候就要用到GC垃圾回收机制。 阅读详情

相关推荐

JVM垃圾回收相关面试问题总结

大多数情况下,对象在新生代中 Eden 区分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次 Minor GC在 JDK 7 版本及 JDK 7 版本之前,堆内存被通常分为下面三部分:新生代内存(Young Generation)老生代(Old Generation)永久代(Permanent Generation)(JDK 8 版本之后 PermGen(永久代) 已被 Metaspace(元空间) 取代,元空间使用的是本地内存,方法区的实现就是由Metaspace,方法区是个逻辑概念。

qazwsxxxxxasd的博客 1155

JVM性能调优实战——UseParallelGC

前言 在生产环境中,你是否遇到过这样的问题? 1)系统运行一段时间后old区空间正逐渐减少? 2)遇到秒杀促销活动等场景old区存储突然暴增,导致JVM Full GC。fgc time持续过长导致cpu 100%? 3)jvm eden区分配的内存实际并没有按照配置的指定?survivor区对象晋升到old区并没有达到默认的15次? 4)如何避免Full GC,JVM产生FGC后如何解决? …… 接下来的内容,我将从实际场景出发,分别使用三种垃圾收集器:ParallelGC,Concurrent Mar.

augsm的专栏 1万+

Vivado 2018.3 SDK烧写bin文件避坑指南:如何解决QSPI模式下的常见错误

本文深入解析了在Vivado 2018.3 SDK中为Zynq FPGA烧写QSPI Flash时遇到的常见问题,特别是启动模式为QSPI时出现的警告与失败。文章从Zynq启动机制入手,提供了修改FSBL代码以强制使用JTAG模式、调整硬件配置等核心解决方案,并分享了实战案例与最佳实践,帮助开发者高效避坑,确保bin文件烧写成功。

arduino9maker的博客 389

GC参数解析 UseSerialGC、UseParNewGC、UseParallelGC、UseConcMarkSweepGC

因为为java语言提供支持的虚拟机有很多,不同虚拟机提供的垃圾收集器差别很大。这里讨论的收集器基于JDK1.7 Update14之后的HotSpot虚拟机。这个虚拟机包含的所有垃圾收集器如下图 -XX:+UseSerialGC 使用串行回收器进行回收,这个参数会使新生代和老年代都使用串行回收器,新生代使用复制算法,老年代使用标记-整理算法。Serial收集器是最基本、历史最悠久的收集器,它是一个...

leo187的博客 3万+

[ESP32]:基于esp-modbus实现serial主机

[ESP32]:基于esp-modbus实现serial主机

LINKKEEE的博客 2569

具身智能与空天具身智能:从理论到实践的跨领域融合

本文深入探讨了具身智能从理论到实践的发展,重点分析了空天具身智能这一前沿领域。文章阐述了如何为AI赋予“身体”,使其通过与环境实时交互进化智能,并详细拆解了构建空天智能体所需的核心技术模块,包括多模态感知、基于大模型的决策规划以及鲁棒控制。同时,结合山区电力线自主巡检等实战案例,展望了多智能体协同与标准化等未来方向。

weixin_29045585的博客 533

java的gc原理_JAVA GC 原理详解

大多数情况下我们对GC的了解都只是浅层含义上的,下面我们来详细讲解下内部的一些实现原理。讲解GC之前,我们得先了解下JVM的内存结构,才能让我们理解GC导致是干嘛的。一.JVM 内存结构JVM内存结构由5个部分组成,分别如下1. 程序计数器(Program Conuter Register)一块较小的内存空间,它是当前线程执行字节码的行号指示器,字节码解释工作器就是通过改变这个计数器的值来选取下一...

weixin_36054159的博客 689

一层一责,一聚合一包:DDD分层架构下的微服务代码模型、三重边界与服务数据协作

领域模型画得再清楚,落不进代码也是空谈。本文以一个可运行的客户中心微服务为线索,先对比整洁架构、六边形架构与DDD分层架构,指出三者共同守护的那条隔离核心业务的红线;再把DDD分层落成四个一级目录、以聚合为单位分包、一个聚合一个仓储的代码模型,拆解实体、聚合根、值对象、领域事件、领域服务与仓储的设计要点;随后厘清逻辑、物理、代码三重边界,并用检查器实测:干净代码零越界,拆出积分聚合时领域代码无需改动;注入九处越界后,必须先重构才能拆分。最后梳理服务调用三场景与PO、DO、DTO、VO的协作。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 177万+

垃圾回收调优及JVM参数详解

一、常用JVM配置参数1.1基本参数 -client,-server    这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能  和内存   管理效率不如server模式,通常用于客户端应用程序。相反,server模式启动比client慢,但可

ymeng_bupt的专栏 1169

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

【目标检测】基于yolov5的安全帽佩戴检测系统(附代码和数据集)

学无止境、积少成多、厚积薄发 3107

使用 MATLAB/Simulink 构建一个基于PID控制的直流电机速度调节系统模型

直流电机(DC Motor)因其结构简单、成本低廉、易于控制等特点,广泛应用于各种工业自动化和家用电器中。PID控制器作为最常用的控制策略之一,在直流电机的速度调节系统中具有重要应用价值。通过合理调整比例(P)、积分(I)、微分(D)三个参数,可以实现对电机速度的精确控制。本教程将带你使用构建一个基于PID控制的直流电机速度调节系统模型,涵盖电机模型构建、PID控制器设计、系统仿真与调试等多个方面。本文介绍了如何使用构建一个基于PID控制的直流电机速度调节系统模型。

amy_mhd的博客 217

JVM基础知识总结

Java虚拟机的基本结构 1. 堆空间 2. 直接内存 3. JAVA栈 4. 本地方法栈 5. PC寄存器 6. 垃圾回收系统 7. 执行引擎 JVM 堆空间布局 JVM 的分代 年轻代 老年代 永久代 分代的原因: 1. 不同类型对象的生命周期是不一样的 2. 不同年代的对象才去不同的收集方式,以便提高回收效率 3. 如果不分代,每次垃圾回收都需要遍历内存空间,花费时间较长,效率低 4...

weixin_39341215的博客 277

SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解

在SAP系统中,COEP表(成本控制对象行项目表)详解

baidu_35680696的博客 1840

Java面试--垃圾回收机制(GC)

面试题:垃圾回收机制(阿里、三七互娱、商汤、大疆面试题) 面试题:jvm查看gc命令(蘑菇街面试题) 面试题:如果频繁老年代回收怎么分析解决(蚂蚁金服面试题) 面试题:gc的Gengerational collector(携程面试题) 一、要回收哪些区域 在JVM内存模型中,有三个是不需要进行垃圾回收的:程序计数器、JVM栈、本地方法栈。因为它们的生命周期是和线程同步...

小刺猬 1万+

手把手教你学Simulink——基于通信协议与标准的场景实例:卫星通信中的网络安全协议(IPSec)仿真

随着卫星通信在国防、金融、应急指挥、能源管网等关键领域的广泛应用,其安全性已成为系统设计的核心要求。然而,卫星链路具有广播特性、长距离传输、地面站分布广等特点,极易遭受窃听、篡改、重放、中间人攻击等网络威胁。传统的“信任链路层安全”已不足以应对现代网络攻击。为此,国际标准组织(如IETF、ETSI、CCSDS)推荐在卫星通信中部署协议,实现端到端的数据机密性、完整性、身份认证和抗重放保护。本文将手把手教你如何在中构建一个符合标准的仿真系统,涵盖从明文传输到加密隧道的完整安全链路建模。本文完整实现了。

MHD0815的博客 149

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

一篇文章搞定java中的垃圾回收机制面试题

    一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新的对象使用。对于对象内存的释放就是垃圾回收机制,也叫做gc,对于java开发者来说gc是一个双刃剑 我们这里找了两张搞笑图片分别来表示c语言的垃圾回收和 java的垃圾回收。 注意:并...

边缘ob 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

面试之JVM垃圾回收

可达性分析法就是目前的主流算法,也是java正在使用的算法。它的做法是,通过一系列被称为“GC Roots”的对象作为起点,从这些起点开始往下搜索,搜索所走过的路径称为引用链(Reference Chain)。当一个对象没有和任何引用链相连,即称为该对象不可达(图论的说法),认为该对象死亡。来看下面这张图:上图中A、B、C都跟GC Roots有直接或间接的引用关系,所以是存活对象。而D、E、F虽然相互之间有引用,但是和GC Roots并无引用关系,所以是死亡对象。

NBlinge的博客 1674

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

温度PID控制PLC程序

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

JAVA垃圾回收机制

通过自动垃圾回收算法对堆内存中 new出的且不再被引用的对象 进行回收

weixin_53975556的博客 9752

Java的垃圾回收机制如何工作?如何优化垃圾回收性能?

Java的垃圾回收(GC)机制是自动内存管理的一部分,它负责回收不再使用的对象,以便释放内存资源,避免内存泄漏。作为Java开发者,理解垃圾回收机制的工作原理,并学会如何优化垃圾回收性能,是提高Java程序运行效率的关键。本篇文章将详细讲解Java垃圾回收机制的原理、工作流程,并提供一些优化建议,让你轻松应对GC相关的问题!🚀垃圾回收的目的是自动回收那些不再使用的对象的内存空间,从而释放内存资源。Java通过垃圾回收机制避免了内存泄漏的风险,也减轻了开发者的负担。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 1万+

[java八股文][Java虚拟机面试篇]垃圾回收

垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责自动释放不再被程序引用的对象所占用的内存,这种机制减少了内存泄漏和内存管理错误的可能性。内存不足时:当JVM检测到堆内存不足,无法为新的对象分配内存时,会自动触发垃圾回收。手动请求:虽然垃圾回收是自动的,开发者可以通过调用或建议 JVM 进行垃圾回收。不过这只是一个建议,并不能保证立即执行。JVM参数-Xmx(最大堆大小)、-Xms(初始堆大小)等。对象数量或内存使用达到阈值。

hzx2400的博客 2774

Java面试必备:Java垃圾回收调优指南

Java的垃圾回收(GC)是Java虚拟机(JVM)自动管理内存的核心机制,良好的GC调优可以显著提升应用性能,减少停顿时间。本文将深入探讨Java垃圾回收的调优策略,并通过流程图帮助理解关键概念。

qq_58299462的博客 1898

Java面试之垃圾回收总结

1. JVM垃圾回收机制与实现 堆:所有的对象实例与数组,GC堆,分为新生代与老年代 栈:栈帧包含局部变量表(基本数据类型 8种、对象引用类型)、操作数栈、动态链接、方法出口 方法区:类信息、常量、静态变量、即时编译器编译后的代码等数据,也成为永久代 一般说栈指的是 虚拟机栈,或者说是虚拟机栈中的局部变量表TLAB:本地线程分配缓冲,线程分配内存,现用TLAB分配,用完重新分配新的TLAB 可以设

Vtamins的博客 1万+

Java面试-常见的垃圾回收器:Serial、Parallel、CMS、G1、ZGC

《Java垃圾回收器深度解析》摘要:本文系统梳理Java五大主流垃圾回收器(Serial、Parallel、CMS、G1、ZGC)的工作原理与适用场景。通过生动比喻(如Serial是"单兵作战的扫街大爷")、流程图解和代码示例(如ParallelGC配置),深入解析各回收器特点:从单线程的Serial到追求吞吐量的Parallel,从低停顿的CMS到分区收集的G1,再到革命性的ZGC。文章包含GC参数配置指南、决策树和面试高频问题,帮助开发者根据应用场景(内存大小、延迟要求等)选择最优回

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

java垃圾回收面试题

以上题目涵盖了Java垃圾回收的多个方面,希望对你有所帮助!

weixin_43801300的博客 645

Java面试必备:Java中的垃圾回收算法

在Java中,垃圾回收(Garbage Collection, GC)是自动内存管理的重要组成部分。Java虚拟机(JVM)通过垃圾回收机制自动回收不再使用的对象,释放内存空间,避免内存泄漏。Java中的垃圾回收算法有多种,每种算法都有其独特的优缺点和适用场景。本文将介绍几种常见的垃圾回收算法,并通过流程图帮助读者更好地理解这些算法的工作原理。

qq_58299462的博客 1592

面试官对java垃圾回收面试要求的整理

作者:郭无心链接:https://www.zhihu.com/question/35164211/answer/68265045来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。在公司当技术面试官几年间,从应届生到工作十几年的应聘者都遇到过。先表达一下我自己对面试的观点: 1.笔试、面试去评价一个人肯定是不够准确的,了解一个人最准确的方式就是“路遥知马力,日久见...

白小菜的博客 4011
上一篇: Java基础知识总结(全)
下一篇: 阿里妈妈再也不用担心异步任务失败后没人知晓了
null.equals()
博客等级 码龄12年 209粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值