Java 堆和栈、垃圾回收

简单的解释一下垃圾回收

Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中

一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,
它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。
进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。
比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性. 如何确定一个对象是否可以被回收?

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象
在年轻代中经历了N(15)次垃圾回收后仍然存活的对象,就会被放到年老代中。 用于存放静态文件,如今Java类、方法等。

引用计数算法:判断对象的引用数量 任何引用计数为0的对象实例可以被当作垃圾收集

  1. 标记——清除算法
    1、标记所有需要回收的对象2、标记完成后,清除被标记的对象。

    1. 标记——复制算法

       标记——复制存储算法通过采用双区域交替使用这种方式解决了标记——清除算法中效率低下的问题。
       1.存活的对象将被复制到另外一块区域。2.原先被使用的区域被重置,转为空闲区
      
    2. 标记——整理算法

      标记-复制算法在对象存活率较高的情况下就要进行较多的复制操作,更重要的是该算法浪费一般的内存空间,为了解决该问题,
      出现了标记——整理算法:
      其标记的过程和“标记-清除”算法一样,而整理的过程则是让所有存活的对象都想另外一端移动,然后直接清理掉端边界以外的内存。

    4.分代收集算法

      新生代,大多都会死去《《《《《   标记——复制算法   
      老年代:  标记-清除  标记-复制
    

    5.增量收集算法
    以上所述的算法,都存在一个缺点:在进行垃圾回首时需要暂停当前应用的执行,
    也就是这时候的垃圾回收线程不能和应用线程同时运行
    这也是增量收集算法的目标,即在不中断应用线程的状态下垃圾回收线程也能进行垃圾回收。

但是垃圾回收的知识堆内存,栈内存是JVM自动管理的,栈的内存都是随着函数的开始执行和结束自动分配,释放的

堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,
因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。
但缺点是,由于要在运行时动态分配内存,存取速度较慢。

在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建。堆区的存在是为了存储对象实例

栈的优势是,存取速度比堆要快,而且栈数据可以共享。
但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int,
short, long, byte, float, double, boolean,
char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享
每个线程对应着一个虚拟机栈,因此虚拟机栈也是线程私有的。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值