【入门】JVM垃圾回收机制【待续】

【入门】JVM垃圾回收机制

垃圾收集(Garbage Collection,GC)……1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lips还在胚胎时期时,人们就在思考GC需要完成的3个事情:

  • 哪些内存需要回收?

  • 什么时候回收?

  • 如何回收?1

1.哪些内存需要回收?

1.1为什么需要垃圾回收?

因为java使用了动态内存分配,而这是支持多态所必须的。内存回收的便是这部分内存。

java没有什么语法和内存有直接联系,不想C或C++中有malloc这种语法直接操作内存,但程序执行都需要内存控件支持,不然我们的那些数据存在哪里?…显示的内存申请有两种:一种是静态内存分配,另一种是动态内存分配。2

(1)静态内存的回收

什么是静态内存分配?哪些地方使用静态内存?

何物

在java被编译时就已经能够确定所需的内存空间,当程序被加载时系统把内存一次性分配给它。静态内存的分配和回收都具有确定性,会随着方法或线程结束而回收,

何处

程序计数器,虚拟机栈,本地方法栈。

何时

程序加载时

在java中静态内存分配是指在java被编译时就已经能够确定所需的内存空间,当程序被加载时系统把内存一次性分配给它。这些内存不会在程序执行时发生变化,直到程序执行结束时内存才被回收。在java的类和方法中的局部变量包括原生数据类型(int,long,char等)和对象的引用都是静态分配内存的…对象的类型,它们的引用会占用4个字节空间。

静态内存空间当这段代码执行结束时回收,。。。。。。,这些内存是在 java栈上分配的,当这个方法运行结束时,对应的栈帧也就撤销,所以分配的惊天内存空间也就回收了。2

由一点我们需要了解到

尽管在运行期会由JIT编译器进行一些优化,但在本章基于概念模型的讨论中,大体上可以认为是编译器可知的。1

(2)动态内存的回收

什么是动态内存分配?哪些地方使用动态内存?

何物

是一种在程序执行时才能确定大小而进行内存分配的方式,是程序共享的,不一定随着方法的执行结束而消失

动态分配即在程序执行时才知道要分配的存储空间大小,而不是在编译时能够确定的。1

何处

Java堆中,对象。

JAVA中对象的内存空间是动态分配的。1

何时

对象创建时。

会在堆中分配对象所需内存(动态内存分配),并在栈中分配4字节的地址指针空间,指向对象在堆中的地址。(静态内存分配)

1.2 哪些对象需要被回收

垃圾回收器只知道释放那些经由new分配的内存。3

(1) 不再被需要的对象
  • 引用计数器算法

    JVM的实现中几乎没有使用这种方式的,无法回收循环引用的对象

  • 可达性分析算法

    • GCRoots
    • 可以作为GCRoots的都有哪些
(2) 强软弱虚四种应用方式中需要被回收的(since JDK1.2)

https://blog.csdn.net/huanghanqian/article/details/79442950

2.什么时候回收?

1.当jvm无法为新的对象分配空间的时候4

(1)Minor GC

当jvm无法为新的对象分配空间的时候就会发生Minor gc,所以分配对象的频率越高,也就越容易发生Minor gc。

首先区分一下Minor GC和Full GC。
Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的,所以Minor GC非常平凡,一般回收速度也比较i快。

Major GC/Full GC 是老年代GC,指的是发生在老年代的GC,出现Major GC一般经常会伴有Minor GC,Major GC的速度比Minor GC慢的多。

(2)Full GC:

发生GC有两种情况,

①当老年代无法分配内存的时候,会导致MinorGC,

②当发生Minor GC的时候可能触发Full GC,由于老年代要对年轻代进行担保,由于进行一次垃圾回收之前是无法确定有多少对象存活,因此老年代并不能清除自己要担保多少空间,因此采取采用动态估算的方法:也就是上一次回收发送时晋升到老年代的对象容量的平均值作为经验值,这样就会有一个问题,当发生一次Minor GC以后,存活的对象剧增(假设小对象),此时老年代并没有满,但是此时平均值增加了,会造成发生Full GC

2.手动GC时5

手动GC不会立即执行GC,只是通知JVM需要执行GC。 因为Java的GC是由JVM自行调动的,在需要的时候才会被执行。

System.gc();
Runtime.getRuntime().gc();
//JMX
java.lang.management.MemoryMXBean.gc()//第一种和第三种其实都是调用了 Runtime.getRuntime().gc(); 

3.如何回收?

3.1垃圾回收算法

(1)标记-清除算法
定义:
优点:
缺点
(2)标记-整理算法
定义:
优点:
缺点
(3)复制算法
定义:
优点:
缺点
(4)分代收集算法
定义:
优点:
缺点

年轻代老年大比例写这里?

1/3,8/1/1

3.2HotSpot的算法实现

(1)枚举根节点
(2)安全点
(3)安全区域

3.3 垃圾回收器

(1)Serial

单线程,

(2)ParNew
(3)Parallel Scavenge
(4)Parallel Old
(5)SerialOld(弃用)
(6)CMS
(7)G1(since 1.7)
(8)zgc(since 11)

3.4 GC日志

名词对照
分析日志

3.5 如何选择一个合适的垃圾回收器

交互少()
交互多(停顿时间短,可控)

3.6 内存分配策略

by Mr.周

(1)对象优先在Eden分配
(2)大对象直接进入老年代
(3)长期存活的对象将进入老年代
(4)动态对象年龄判定
(5)空间分配担保

3.7 如何配置

各种情况下JVM参数

4.补充

finalize方法3

工作原理

用途何再

参考资料:


  1. 《深入理解JAVA虚拟机–JVM高级特性与最佳实践》P61,周志明著 ↩︎ ↩︎ ↩︎ ↩︎

  2. 《深入分析JavaWeb内幕修订版》许令波著 ↩︎ ↩︎

  3. 《Java编程思想》作者 [美] Bruce Eckel ,译者是陈昊鹏。 ↩︎ ↩︎

  4. https://blog.csdn.net/FateRuler/article/details/81191527 ↩︎

  5. https://blog.csdn.net/sdmjhca/article/details/76642517 ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值