jvm内存模型与垃圾回收机制

jvm内存模型

  1. 方法区:也称永久代,存储虚拟机加载的类信息,常量,静态变量,被各个线程共享。永久代的垃圾回收和老年代捆绑在一起的,无论谁满了,都会触发永久代和老年代的垃圾收集。
  2. java堆:
    最大的一块区域,被各个线程共享,存放了对象实例和数组(但不是所有的对象实例都在堆中),可以通过参数-Xms(最小值)和-Xmx(最大值)设置。堆内存=新生代+老年代。
  3. java栈:
    java方法执行的内存模型,线程私有。每个方法被执行的时候都会调用“栈帧”,对应一个栈帧在虚拟机中从入栈到出栈的情况。
  4. 程序计数器:
    最小的一块内存区域,作用是当前线程所执行字节码的行号指示器。字节码解释器工作是,改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,异常处理,线程恢复都依赖此。java的多线程是通过轮流切换并分配处理器执行时间的方法来实现的。在任何一个确定的时刻,一个处理器(多核处理器来说是一个内核)只会执行一条线程中的指令。为了线程切换能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程间的计数器互不影响,这类区域是线程私有区域。
  5. 本地方法栈
    作用同 jvm栈,本地方法栈是为jvm用到的native方法服务的。
  6. 直接内存
    不是虚拟机运行时的一部分,也不是java虚拟机中定义的内存区域,jdk1.4中新加入了
    的NIO,可以调用native方法直接分配堆外内存,不会影响到本机内存。
    参考链接:
https://blog.csdn.net/u011972171/article/details/80398771
https://www.cnblogs.com/dingyingsi/p/3760447.html

gc

  1. 什么时候垃圾回收?

由于对象进行分代处理(新生代,老年代,永久代),因此垃圾回收的区域时间不一样,触发的gc类型也不一样。

  • minor gc:当新对象生成,并且在eden区申请空间失败,就会触发minor gc,清除非存活对象,并且将经历过mionr gc仍存活的对象移动到survivor区。这种方式的gc是对年轻代的eden区进行。大部分对象是从eden区开始的,同时eden区不会分配的很大,eden区的gc会频繁的进行。因而,需要使用速度快、效率高的算法。
  • full gc:对整个堆进行整理,比minor gc要慢,因此尽可能减少full gc的次数。在对jvm调优中,很大程序上就是对full gc的调节。
  1. 导致full gc的原因?
  • 老年代写满
  • 永久代写满
  • 显示调用System.gc()
  • ++上次gc之后heap的各域分配策略动态变化。++
  1. 垃圾回收算法
  • 标记清除算法:首先标记出需要回收的对象,标记完成之后同一回收所有被标记的对象。不足:标记清除后产生大量不连续的内存碎片,内存碎片太多在分配较大对象时,无法找到足够的连续内存不能不触发gc。
  • 复制算法:解决了效率问题,将可用的内存分为两块,每次只用其中的一块,当这块内存用完了,将还存活的对象复制到另外一块上,然后再把已经使用过的内存空间一次性清除。用这种算法回收新生代,将新生代内存分为一块较大的eden区,和两个survivor区,每次使用eden和其中一块survivor。每次回收时,将eden和survivor中还存活的对象一次性复制到另外一块survivor中。eden和survivor在hotpot中默认比例是8:1。当survivor不够用,还需依赖老年代进行分配。
  • 标记整理算法:适用于老年代。将所有存活对象向一端移动,然后直接清理掉边界以外的内存。
  • 分代收集算法:对于新生代,有大量对象死去,少量对象存活,使用复制算法;对于老年代,对象存活率高,不需要额外空间,采用标记-清理或标记整理算法。
  1. 为什么需要垃圾回收?
    如果不进行垃圾回收,内存迟早要被消耗完,因为在不断的分配内存而不进行回收。无非内存无限大,我们可以任性的不回收。但是事实并非如此,所以,垃圾回收是必须的。
  2. 哪些内存需要被回收?
  • 引用计数法:给对象添加一个引用计数器,每当一个地方引用这个对象时,计算器值+1,当引用失效时,计算器值-1。任何时刻计算值为0就是不能再使用。Java中没使用这种算法,因为他很难解决对象之间的引用(当两个对象互相引用,jvm还是会把两个对象回收掉)。
  • 可达性分析法:通过一系列“gc roots”对象作为起始点,从这些结点向下搜索,搜索走过的路径称为引用链,当一个对象到gc roots没有任何引用链(gc roots到对象不可达),说明此对象是不可用的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值