1.软文推荐

2.软文推荐

3.软文推荐

JVM 会自动帮程序员进行垃圾回收,并不需要程序员手动的进行垃圾回收(C++等语言需要自己手动回收垃圾),了解 JVM 的垃圾回收,可以帮程序员写出占用内存更小、更高效的程序。

标记-清除

顾名思义,其过程分为两个阶段,分别是标记清除。首先标记出所有需要回收的对象,然后统一对标记的对象进行回收。这个算法的十分的局限,首先标记和清除的两个过程效率都不高,而且这样的清理方式会产生大量的内存碎片,什么意思呢?

就是虽然总体看起来还有足够的剩余内存空间,但是他们都是以一块很小的内存分散在各个地方。如果此时需要为一个大对象申请空间,即使总体上的内存空间足够,但是JVM无法找到一块这么大的连续内存空间,就会导致触发一次GC。

复制

其大致的思路是,将现有的内存空间分为两半A和B,所有的新对象的内存都在A中分配,然后当A用完了之后,就开始对象存活判断,将A中还存活的对象复制到B去,然后一次性将A中的内存空间回收掉。

这样一来就不会出现使用标记-清除所造成的内存碎片的问题了。但是,它仍然有自己的不足。那就是以内存空间缩小了一半为代价,而在某些情况下,这种代价其实是很高的。堆中新生代就是采用的复制算法。刚刚提到过,新生代被分为了Eden、From Survivor、To Survivor,由于几乎所有的新对象都会在这里分配内存,所以Eden区比Survivor区要大很多。因此Eden区和Survivor区就不需要按照复制算法默认的1:1的来分配内存。在HotSpot中Eden和Survivor的比例默认是8:1,也就意味着只有10%的空间会被浪费掉。

看到这你可能会发现一个问题。既然你的Eden区要比Survivor区大这么多,要是一次GC之后的存活对象的大小大于Survivor区的总大小该怎么处理?的确,在新生代GC时,最坏的情况就是Eden区的所有对象都是存活的,那这个JVM会怎么处理呢?这里需要引入一个概念叫做内存分配担保。当发生了上面这种情况,新生代需要老年代的内存空间来做担保,把Survivor存放不下的对象直接存进老年代中。

标记-整理

标记-整理其GC的过程与标记-清楚是一样的,只不过会让所有的存活对象往同一边移动,这样一来就不会像标记-整理那样留下大量的内存碎片。

分代收集

这也是当前主流虚拟机所采用的算法,其实就是针对不同的内存区域的特性,使用上面提到过的不同的算法。

例如新生代的特性是大部分的对象都是需要被回收掉的,只有少量对象会存活下来。所以新生代一般都是采用复制算法

而老年代属于对象存活率都很高的内存空间,则采用标记-清除标记-整理算法来进行垃圾回收。

本文来源:www.lxlinux.net/9387.html,若引用不当,请联系修改。

相关文章 8

1

北京vps云咨询高防御虚拟主机(免费虚拟主机vps) 1分钟前

目录:1、vps,虚拟主机,云主机是什么?三种有什么区别?2、VPS、虚拟机、云主机,这三个到底有什么区别?3、vps,虚拟主机,云主机是...

2

Linux中三个常用的网络监视器 3分钟前

通过网络监视器可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示,本篇文章为大家...

3

Linux系统安装docker教程 4分钟前

Docker 是一个开放源码的应用容器,让开发者可以打包他们的应用到一个可移植的 镜像 中,然后发布到任何 Linux 或 Windows 系统上,简单来说...

4

秒杀(秒杀小说全文阅读免费) 7分钟前

目录:1、秒杀是什么意思?2、秒杀是什么意思3、什么是秒杀秒杀是什么意思? 秒杀是以压倒性优势一招致命或在极短时间(比如一秒钟)...

5

详解puppet 8分钟前

...

6

讲解一下C# 集合(Collection) 10分钟前

集合(Collection)类是专门用于数据存储和检索的类。这些类提供了对栈(stack)、队列(queue)、列表(list)和哈希表(hash table)的支持。...

7

主机销售系统源码(主机销售系统源码查询) 11分钟前

目录:1、哪家商城系统可以提供源代码?2、数据结构:产品进销存管理系统的源代码(c语言或c++的)3、网上商城系统代码是怎么开发的?...

8

讲解一下assertion(断言)的使用方法以及注意事项 12分钟前

assertion(断言)在软件开发中是一种常用的调试方式,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保...