JVM垃圾回收GC原理

Jvm中GC种类和算法 1.什么是GC GC(GarbageCollection)是垃圾回收机制,在Java中开发人员无法使用指针来自由的管理内存,GC是JVM对内存(实际上就是对象)进行管理的方式。GC使得Java开发人员摆脱了繁琐的内存管理工作,让程序的开发更有效率。 2. GC基本原理 Java的内存管理实际上就是对象的管理,其中包括对象的分配和释放。   对于程序员来说,分配对象使用new关 阅读详情

 

一、相关概念 


基本回收算法 

1.
引用计数(Reference Counting) 
比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。 
2.
标记-清除(Mark-Sweep) 
此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。 
3.
复制(Copying) 
此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不过出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。 
4.
标记-整理(Mark-Compact) 
此算法结合了 “标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象 “压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。 
5.
增量收集(Incremental Collecting) 
实施垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。 
6.
分代(Generational Collecting) 


基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。 

1. Young
(年轻代) 
年轻代分三个区。一个Eden区,两个 Survivor区。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。 
2. Tenured
(年老代) 
年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。 
3. Perm
(持久代) 
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=<N>进行设置。 


GC类型 
GC
有两种类型:Scavenge GC和Full GC。 

1. Scavenge GC 
一般情况下,当新对象生成,并且在Eden申请空间失败时,就好触发Scavenge GC,堆Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。 
2. Full GC 
对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此应该尽可能减少Full GC。有如下原因可能导致Full GC: 
* Tenured
被写满 
* Perm
域被写满 
* System.gc()
被显示调用 
*
上一次GC之后Heap的各域分配策略动态变化 


分代垃圾回收过程演示 

 1.

<!--StartFragment -->  
 

 2.



 3.



 4.



 


 



二、垃圾回收器 


目前的收集器主要有三种:串行收集器、并行收集器、并发收集器。 

1.
串行收集器 

使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。可以使用-XX:+UseSerialGC打开。 

2.
并行收集器 
1.
对年轻代进行并行垃圾回收,因此可以减少垃圾回收时间。一般在多线程多处理器机器上使用。使用-XX:+UseParallelGC.打开。并行收集器在J2SE5.0第六6更新上引入,在Java SE6.0中进行了增强--可以堆年老代进行并行收集。如果年老代不使用并发收集的话,是使用单线程进行垃圾回收,因此会制约扩展能力。使用-XX:+UseParallelOldGC打开。 
2.
使用-XX:ParallelGCThreads=<N>设置并行垃圾回收的线程数。此值可以设置与机器处理器数量相等。 
3.
此收集器可以进行如下配置: 
*
最大垃圾回收暂停:指定垃圾回收时的最长暂停时间,通过-XX:MaxGCPauseMillis=<N>指定。<N>为毫秒.如果指定了此值的话,堆大小和垃圾回收相关参数会进行调整以达到指定 值。设定此值可能会减少应用的吞吐量。 
*
吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值,通过-XX:GCTimeRatio=<N>来设定,公式为1/(1+N)。例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收。默认情况为99,即1%的时间用于垃圾回收。 

3.
并发收集器 
可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC打开。 
1.
并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象。在每个年老代垃圾回收周期中,在收集初期并发收集器会对整个应用进行简短的暂停,在收集中还会再暂停一次。第二次暂停会比第一次稍长,在此过程中多个线程同时进行垃圾回收工作。 
2.
并发收集器使用处理器换来短暂的停顿时间。在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,一般情况下1<=K<=N/4。 
3.
在只有一个处理器的主机上使用并发收集器,设置为incremental mode模式也可获得较短的停顿时间。 
4.
浮动垃圾:由于在应用运行的同时进行垃圾回收,所以有些垃圾可能在垃圾回收进行完成时产生,这样就造成了“Floating Garbage”,这些垃圾需要在下次垃圾回收周期时才能回收掉。所以,并发收集器一般需要20%的预留空间用于这些浮动垃圾。 
5. Concurrent Mode Failure
:并发收集器在应用运行时进行收集,所以需要保证堆在垃圾回收的这段时间有足够的空间供程序使用,否则,垃圾回收还未完成,堆空间先满了。这种情况下将会发生“并发模式失败”,此时整个应用将会暂停,进行垃圾回收。 
6.
启动并发收集器:因为并发收集在应用运行时进行收集,所以必须保证收集完成之前有足够的内存空间供程序使用,否则会出现“Concurrent Mode Failure”。通过设置-XX:CMSInitiatingOccupancyFraction=<N>指定还有多少剩余堆时开始执行并发收集 

4.
小结 
*
串行处理器: 
--
适用情况:数据量比较小(100M左右);单处理器下并且对响应时间无要求的应用。 
--
缺点:只能用于小型应用 
*
并行处理器: 
--
适用情况:“对吞吐量有高要求”,多CPU、对应用响应时间无要求的中、大型应用。举例:后台处理、科学计算。 
--
缺点:应用响应时间可能较长 
*
并发处理器: 
--
适用情况:“对响应时间有高要求”,多CPU、对应用响应时间有较高要求的中、大型应用。举例:Web服务器/应用服务器、电信交换、集成开发环境。 


三、常见配置举例 

1.
堆大小设置 
JVM
中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。 
典型设置: 
* java -Xmx3550m -Xms3550m -Xmn2g -Xss128k 
-Xmx3550m
:设置JVM最大可用内存为3550M。 
-Xms3550m
:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 
-Xmn2g
:设置年轻代大小为2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 
-Xss128k
:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。 
* java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 
-XX:NewRatio=4:
设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5 
-XX:SurvivorRatio=4
:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6 
-XX:MaxPermSize=16m:
设置持久代大小为16m。 
-XX:MaxTenuringThreshold=0
:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 

2.
回收器选择 
JVM
给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。 
1.
吞吐量优先的并行收集器 
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。 
典型配置: 
* java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 
-XX:+UseParallelGC
:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。 
-XX:ParallelGCThreads=20
:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。 
* java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC 
-XX:+UseParallelOldGC
:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。 
* java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 
-XX:MaxGCPauseMillis=100:
设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。 
* java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy 
-XX:+UseAdaptiveSizePolicy
:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。 
2.
响应时间优先的并发收集器 
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。 
典型配置: 
* java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC 
-XX:+UseConcMarkSweepGC
:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。 
-XX:+UseParNewGC:
设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。 
* java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction
:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 
-XX:+UseCMSCompactAtFullCollection
:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 

3.
辅助信息 
JVM
提供了大量命令行参数,打印信息,供调试使用。主要有以下一些: 
* -XX:+PrintGC 
输出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] 

[Full GC 121376K->10414K(130112K), 0.0650971 secs] 
* -XX:+PrintGCDetails 
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] 

[GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs] 
* -XX:+PrintGCTimeStamps -XX:+PrintGC
:PrintGCTimeStamps可与上面两个混合使用 
输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] 
* -XX:+PrintGCApplicationConcurrentTime:
打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用 
输出形式:Application time: 0.5291524 seconds 
* -XX:+PrintGCApplicationStoppedTime
:打印垃圾回收期间程序暂停的时间。可与上面混合使用 
输出形式:Total time for which application threads were stopped: 0.0468229 seconds 
* -XX:PrintHeapAtGC:
打印GC前后的详细堆栈信息 
输出形式: 
34.702: [GC {Heap before gc invocations=7: 
def new generation total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000) 
eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000) 
from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000) 
to space 6144K, 0% used [0x21bd0000, 0x21bd0000, 0x221d0000) 
tenured generation total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000) 
the space 69632K, 3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000) 
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000) 
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000) 
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000) 
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000) 
34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8: 
def new generation total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000) 
eden space 49152K, 0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000) 
from space 6144K, 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000) 
to space 6144K, 0% used [0x221d0000, 0x221d0000, 0x227d0000) 
tenured generation total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000) 
the space 69632K, 4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000) 
compacting perm gen total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000) 
the space 8192K, 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000) 
ro space 8192K, 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000) 
rw space 12288K, 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000) 
} 
, 0.0757599 secs] 
* -Xloggc:filename:
与上面几个配合使用,把相关日志信息记录到文件以便分析。 

4.
常见配置汇总 
1.
堆设置 
* -Xms:
初始堆大小 
* -Xmx:
最大堆大小 
* -XX:NewSize=n:
设置年轻代大小 
* -XX:NewRatio=n:
设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 
* -XX:SurvivorRatio=n:
年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 
* -XX:MaxPermSize=n:
设置持久代大小 
2.
收集器设置 
* -XX:+UseSerialGC:
设置串行收集器 
* -XX:+UseParallelGC:
设置并行收集器 
* -XX:+UseParalledlOldGC:
设置并行年老代收集器 
* -XX:+UseConcMarkSweepGC:
设置并发收集器 
3.
垃圾回收统计信息 
* -XX:+PrintGC 
* -XX:+PrintGCDetails 
* -XX:+PrintGCTimeStamps 
* -Xloggc:filename 
4.
并行收集器设置 
* -XX:ParallelGCThreads=n:
设置并行收集器收集时使用的CPU数。并行收集线程数。 
* -XX:MaxGCPauseMillis=n:
设置并行收集最大暂停时间 
* -XX:GCTimeRatio=n:
设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) 
5.
并发收集器设置 
* -XX:+CMSIncrementalMode:
设置为增量模式。适用于单CPU情况。 
* -XX:ParallelGCThreads=n:
设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。 


四、调优总结 

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

2.
年老代大小选择 
*
响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得: 
o
并发垃圾收集信息 
o
持久代并发收集次数 
o
传统GC信息 
o
花在年轻代和年老代回收上的时间比例 
减少年轻代和年老代花费的时间,一般会提高应用的效率 
*
吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。 

3.
较小堆引起的碎片问题 
因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置: 
* -XX:+UseCMSCompactAtFullCollection
:使用并发收集器时,开启对年老代的压缩。 
* -XX:CMSFullGCsBeforeCompaction=0
:上面配置开启的情况下,这里设置多少次Full GC后,对年老代进行压缩 

 

 

JVM垃圾回收(GC)深度解析:原理、调优与问题排查 垃圾回收是JVM自动识别并释放"无用对象"所占用内存的过程。"无用对象"指的是不再被任何存活对象引用的对象,这些对象占据的内存若不及时释放,最终会导致OOM(OutOfMemoryError)。JVM垃圾回收是Java应用性能的核心影响因素,除了常见的频繁YGC和Full GC,GC停顿过长、元空间异常等问题同样可能成为系统瓶颈。理解GC原理、掌握各类问题的排查方法是高级Java工程师的必备技能。面对GC问题时,需结合监控工具、日志分析和代码审查,精准定位问题根源——是参数配置不合理,还是代码存在内存泄漏。 阅读详情

相关推荐

UE5实战:如何用Georeference插件搞定百度地图坐标转换(附完整代码)

本文详细解析了在UE5中使用Georeference插件实现百度地图坐标转换的全流程,包括BD-09到UE内部坐标的转换算法、UTM投影配置及性能优化技巧。通过完整代码示例和实战案例,帮助开发者高效解决数字孪生项目中的地理坐标转换难题。

weixin_30955617的博客 94

GC垃圾回收机制

在java程序运行的过程中,会产生大量的对象,因每个对象所能承担的职责不同所具有的功能不同所以也有着不一样的生命周期,有的对象生命周期较长,比如Http请求中的Session对象,线程,Socket连接等;所以这几个区域的内存分配与回收是确定的,我们不需要管的。当JVM触发GC时,首先会让所有的用户线程到达安全点SafePoint时阻塞,也就是STW,然后枚举根节点,即找到所有的GC Roots,然后就可以从这些GC Roots向下搜寻,可达的对象就保留,不可达的对象就回收。所以,垃圾回收是必须的。

CA优快云的博客 6118

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 173

jvm——垃圾回收机制(GC)详解

什么是GC?GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。为什么要GC?堆内存是各个线程共享的空间,不能无节制的使用。服务器运行的时间通常都很长。累积的对象也会非常多。这些对象如果不做任何清理,任由它们数量不断累加,内存很快就会耗尽。所以GC就是要把不使用的对象都清理掉,把内存空间空出来,让项目可以持续运行下去。什么样的对象是垃圾对象?不再使用或获取不到的对象是垃圾对象。如何把垃圾对象找出来?

weixin_62458944的博客 1万+

Modelsim 安装步骤详解

Modelsim 安装步骤详解目录一、modelsim简述及下载1、简介及特点2、modelsim版本3、modelsim下载二、安装步骤详解三、注册简述四、总结与参考资料1、总结2、参考资料 目录 本篇文章主要对Modelsim SE版本安装步骤的介绍。 一、modelsim简述及下载 1、简介及特点 简介 modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单

执迷不悟 15万+

Excel-MCP实战指南:零代码实现大模型与Excel的智能交互

本文详细介绍了Excel-MCP工具如何实现大模型与Excel的无缝交互,无需编写代码即可完成数据读写、图表生成等复杂操作。通过实战案例展示了Excel-MCP在销售报表自动化、财务对账等企业级场景中的应用,大幅提升工作效率。文章还提供了安装指南、核心功能解析和常见问题解决方案。

weixin_29212429的博客 433

JVM之垃圾回收机制(GC)

在做Java开发的过程中,我们会不断地创建很多的对象,这些对象数据会占用系统内存,如果得不到有效的管理,内存的占用会越来越多,甚至会出现内存溢出的情况,所以,我们需要进行对内存进行合理地释放,这个时候GC就派上大用场的。垃圾回收(GC)是由Java虚拟机(JVM)垃圾回收器提供的一种对内存回收的一种机制,它一般会在内存空闲或者内存占用过高的时候对那些没有任何引用的对象不定时地进行回收。1.对于强引用,平时在编写代码时会经常使用。第一次标记如果对象在进行可达性分析后发现没有与第二次标记。...

weixin_72753070的博客 1万+

AI辅助专利撰写实战:用Codex 30分钟生成发明专利初稿

这次我们来看一个用 Codex 从零开始撰写发明专利的实战项目。对于技术研发人员、产品经理或初创团队来说,专利申请是保护创新成果、构建技术壁垒的关键一步。然而,撰写一份高质量的专利申请书,尤其是权利要求书和说明书,往往需要专业的法律和技术语言,耗时耗力。这个项目演示了如何利用 AI 工具 Codex,在短时间内生成一份结构完整、逻辑清晰、具备授权潜力的专利申请文件初稿。 整个过程的核心不是让 AI 完全替代专利代理人,而是将其作为强大的“技术翻译”和“内容生成”助手。它能将你的技术构思、流程图、核心算法或产

weixin_32181267的博客 415

最详细的JVM&GC讲解

这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的差异也比较大。 不过文中一些JVM参数示例都是实际项目里调优的结果,还是经受过实战考验的。 目录 JVM简介 JVM结构 2.1 方法区 2.1.1 常量池 2.1.1.1 Class文件中的常量池 2.1.1.2 运行时常量池 2.1.1.3 常量池的好处 2.1.1.4 基本类型的包装类和常量池 2.2 堆 2.3 Java栈 2.3.1 栈帧 2.3.

做的过程自我总结 2890

uniapp - H5网页uni.getLocation报错getLocation:fail Geolocation permission denied.Get ipLocation failed.

uni.getLocation getLocation:fail Geolocation permission denied.Get ipLocation failed.,uni.getLocation定位失败,uni-app getLocation()无法获取定位,一直fail()uniapp移动端h5网页,uniApp微信内置浏览器定位失败,如何解决这个问题,uniapp h5 uni.getLocation获取位置失败怎么办,UNI-APP获取当前位置,uni.getLocation定位失败,unia

🏆 前端领域优质创作者 4242

RK3568笔记十七:LVGL v8.2移植

若该文为原创文章,转载请注明原文出处。本文介绍嵌入式图形库移植到Linux开发板ATK-RK3568上的步骤。

4232

JVM垃圾回收和GC收集器运行原理

GC收集器是垃圾回收的具体实现,它根据不同的算法和策略来回收垃圾对象。JVM提供了多种GC收集器,每种收集器都有不同的特点和适用场景。JVM垃圾回收和GC收集器是Java开发中不可或缺的技术,它们解放了开发者从繁琐的内存管理中。通过使用不同的GC收集器,我们可以根据应用的需求选择最适合的收集器,提高程序的性能和稳定性。

赵KK的博客 667

NPC 三电平逆变器中点电位平衡算法详解

最常用:零序电压注入(简单、计算量小)最可靠:虚拟空间矢量调制(VSVPWM)及其改进形式(全范围平衡)趋势:结合模型预测控制(MPC)或智能算法(模糊、神经网络)进一步提升动态性能和鲁棒性。NPC 三电平逆变器中点电位平衡算法的 C# 实现示例(零序电压注入法 + 闭环补偿)在 NPC(Neutral Point Clamped)三电平逆变器中,中点电位平衡最常用且易于软件实现的方案是零序电压注入法。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 325

JVM垃圾回收(GC)核心原理全解析

本文深入解析JVM垃圾回收(GC)核心原理,从垃圾判断(可达性分析)、回收算法(标记-清除/复制/整理)到分代收集理论。详细介绍了主流收集器(Serial/ParNew/CMS/G1/ZGC)的特点及适用场景,并给出生产调优建议。重点阐述STW机制及其优化方式,同时提供GC日志分析方法和参数配置示例。适用于JDK8+版本,帮助开发者理解GC工作机制并优化应用性能。

m0_57545130的博客 580

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JVM调优总结+JVM垃圾回收(GC)原理

本文介绍了Java垃圾回收的基本算法(引用计数、标记-清除、复制、标记-整理等)和分代回收机制(年轻代、年老代、持久代)。详细讲解了两种GC类型(Scavenge GC和Full GC)及三种垃圾收集器(串行、并行、并发)的特点与适用场景。串行收集器适合单处理器小应用,并行收集器侧重吞吐量,并发收集器则减少停顿时间。文章还分析了各收集器的配置参数和使用注意事项,为Java内存管理提供了实用参考。

꯭ 瞎꯭扯꯭蛋꯭的博客 439

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JVM垃圾回收核心原理:从GC Roots到调优实战

Java内存管理是现代服务端开发的核心基础,而垃圾回收(GC)机制则是其中最关键的一环。理解GC Roots和可达性分析,是掌握对象生死判定的前提。JVM通过分代收集、标记-清除与复制算法等策略,实现了高效的内存自动回收,为大型应用提供了稳定支撑。在实际生产环境中,频繁Full GC、内存碎片化等问题常常困扰开发者,如何基于GC日志进行JVM调优成为必备技能。从Serial、CMS到G1、ZGC,收集器的演进始终追求更低的停顿与更高的吞吐量。围绕垃圾回收核心原理,从对象判定到算法设计,再到收集器选型与线上故

weixin_29973493的博客 254

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jvm原理 jvm构成 gc垃圾回收

JVM 文章目录JVMJVM是什么?JVM怎么实现跨平台的?浅谈JRE JDKJVM的位置JVM的构成运行时数据区栈堆方法区程序计数器本地方法栈类加载机制什么是类加载机制?类加载器双亲委派机制JVM调优JVM的生命周期GC垃圾回收机制垃圾回收的原因GC常见算法可达性分析算法标记清除算法复制算法标记整理算法终极算法 ( 分代收集算法 ) JVM是什么? ​ JVM是Java Virtual Ma...

小神仙的博客 956

JVM之一:GC垃圾回收原理及算法分析

导读 本人java小白一枚,写博客用意一是做一个学习总结,二是作一个分享。所写内容难免会有错误或者理解不到位的情况,恳请各位大佬不断对我提出批评,用技术吊打我,鞭笞我。拜谢~~ 一、java中的垃圾 1、什么是垃圾 简单来说,就是java内存中没有用了的对象,或者说是已经被嫌弃,死亡的对象。 2、如何去判断对象是属于垃圾对象呢? 最开始,有一种算法叫做引用计数法。顾名思义就是当对象被引用时,通过对对象的引用情况进行登记,如果存在引用的话,则进行加1,否则减1。当该应用计数为0时,则进行回收处理。 示例: 创

weixin_39085109的博客 2123

JVM原理+GC自动垃圾回收机制原理(详细且通俗易懂)

什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),...

miroCyber的博客 1810

JVM 之 GC垃圾回收器原理解析

前言 GC 即 Garbage Collection,中文 意思“垃圾回收”,在有GC之前,我们手动去管理内存,如果你忘记标记某一处已经不再使用的内存,那么这块内存将永远不会被系统回收,也就是常说的 “内存泄露”。 以下所有的 GC 介绍,全部基于主流 JVM 虚拟机 Hotspot。 GC 是如何判断一个对象是存亡? GC判断一个对象存活或死亡就是判断这个对象还存不存在它的引用,常见的两种方...

代码宇宙 298

JVM垃圾回收GC核心机制(原理+实操+面试)

本文全面梳理了JVM垃圾回收(GC)的核心知识体系,涵盖基础概念、算法原理、内存模型、收集器对比、调优策略及面试要点。主要内容包括: GC基础:定义GC三大核心问题(回收对象判定、触发时机、回收方式),详解引用计数与可达性分析算法,分析四大引用类型(强/软/弱/虚)的特点与应用场景。 核心算法: 标记-清除:简单但产生内存碎片 复制算法:新生代专属,8:1:1分区优化 标记-整理:老年代方案,解决碎片问题 分代收集:组合策略适配对象生命周期差异 内存模型:HotSpot分代堆结构(新生代Eden+Survi

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 399

JVM垃圾回收(GC)原理

一、相关概念  基本回收算法  1. 引用计数(Reference Counting)  比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。  2. 标记-清除(Mark-Sweep)  此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍

构思昨天 1164

java中jvm的垃圾回收_JVM垃圾回收(GC)原理

一、相关概念基本回收算法1. 引用计数(Reference Counting)比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。2. 标记-清除(Mark-Sweep)此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂...

weixin_33834241的博客 399

JVM_GC垃圾回收算法与原理

JVM只会对已经死亡的对象触发垃圾回收机制 触发垃圾回收的方式有两种方式系统自动回收(即堆内存已满)与主动调用System.GC()触发垃圾回收条件是被回收对象没有被引用(使用)才可以被回收。 一.如何判断对象是否存活 在堆内存中存放着大量的 Java 对象,垃圾收集器在对堆进行垃圾回收时,首先要判断 哪些对象还活着,哪些对象已经死去(即不在被引用的对象) 1.1引用计数器算法 引用计数器算法指为对象添加一个引用计数器,当 有一个地方引用该对象时,计数 器+1,当引用失效时,计数器-1,当计数器为 0 时表

qq_45022104的博客 300

全面理解 JVM 垃圾回收(GC)机制:原理、流程与实践

JVM GC 机制既有实时性需求,也有吞吐压力。掌握对象生命周期、GC 类型和回收策略,是 Java 性能调优的核心技能。随着 G1、ZGC、Shenandoah 等收集器的引入,并发、可预测、低延迟的垃圾回收将成为主流。

Harry的博客 4152

【JVM】熟悉而又陌生的JVM(肆) - GC 垃圾回收 算法 原理

垃圾回收是JVM中的重中之重,了解GC的基本工作原理对写出来好的代码有关键的作用。 CG对于初学者来讲,并不是一个不可及的,当你静下心深入去探索,其实你发现,也就那么回事。 目录 啥是GC JVM和GC的关系 查找垃圾 引用计数法 可达性分析 finalize方法 四种引用(简单的说) GC的算法 标记-清除 复制 标记-整理 分代收集 收集器 GC日志 关键...

跑跑的博客 542
上一篇: 数据库索引
下一篇: java线程及ComcurrentHashMap
FlyRobin
博客等级 码龄16年 34粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值