博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java垃圾回收
阅读量:6864 次
发布时间:2019-06-26

本文共 1933 字,大约阅读时间需要 6 分钟。

hot3.png

垃圾回收简介

1.JVM

下面图片总结了JVM的关键组件。在JVM体系结构中,与垃圾回收相关的两个主要组件是堆内存和垃圾回收器。堆内存是内存数据区,用来保存运行时的对象实例。垃圾回收器也会在这里操作。现在我们知道这些组件是如何在框架中工作的。

112342_R1dG_2858486.png

2.Java堆内存

我们有必要了解堆内存在JVM内存模型的角色。在运行时,Java的实例被存放在堆内存区域。当一个对象不再被引用时,满足条件就会从堆内存移除。在垃圾回收进程中,这些对象将会从堆内存移除并且内存空间被回收。堆内存以下三个主要区域:

  1. 新生代(Young Generation)
    • Eden空间(Eden space,任何实例都通过Eden空间进入运行时内存区域)
    • S0 Survivor空间(S0 Survivor space,存在时间长的实例将会从Eden空间移动到S0 Survivor空间)
    • S1 Survivor空间 (存在时间更长的实例将会从S0 Survivor空间移动到S1 Survivor空间)
  2. 老年代(Old Generation)实例将从S1提升到Tenured(终身代)
  3. 永久代(Permanent Generation)包含类、方法等细节的元信息(java8已移除)

121314_bcAJ_2858486.png

永久代空间中已经被移除。

垃圾回收机制工作:

Java 垃圾回收是一项自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM 解除了程序员在程序中分配和释放内存资源的开销。

垃圾回收是一种回收无用内存空间并使其对未来实例可用的过程

Eden 区:当一个实例被创建了,首先会被存储在堆内存年轻代的 Eden 区中

Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分,存活的对象(仍然被引用的)从 Eden 区被移动到 Survivor 区的 S0 中。类似的,垃圾回收器会扫描 S0 然后将存活的实例移动到 S1 中。

死亡的实例(不再被引用)被标记为垃圾回收。根据垃圾回收器选择的不同,要么被标记的实例都会不停地从内存中移除,要么回收过程会在一个单独的进程中完成。

老年代: 老年代(Old or tenured generation)是堆内存中的第二块逻辑区。当垃圾回收器执行 Minor GC 周期时,在 S1 Survivor 区中的存活实例将会被晋升到老年代,而未被引用的对象被标记为回收。

老年代 GC(Major GC):相对于 Java 垃圾回收过程,老年代是实例生命周期的最后阶段。Major GC 扫描老年代的垃圾回收过程。如果实例不再被引用,那么它们会被标记为回收,否则它们会继续留在老年代中。

内存碎片:一旦实例从堆内存中被删除,其位置就会变空并且可用于未来实例的分配。这些空出的空间将会使整个内存区域碎片化。为了实例的快速分配,需要进行碎片整理。

垃圾回收中实例的终结

在释放一个实例和回收内存空间之前,Java 垃圾回收器会调用实例各自的 finalize() 方法,从而该实例有机会释放所持有的资源。虽然可以保证 finalize() 会在回收内存空间之前被调用,但是没有指定的顺序和时间。多个实例间的顺序是无法被预知,甚至可能会并行发生。程序不应该预先调整实例之间的顺序并使用 finalize() 方法回收资源。

  • 任何在 finalize过程中未被捕获的异常会自动被忽略,然后该实例的 finalize 过程被取消。
  • JVM 规范中并没有讨论关于弱引用的垃圾回收机制,也没有很明确的要求。具体的实现都由实现方决定。
  • 垃圾回收是由一个守护线程完成的。

垃圾回收器的种类:

  1. 串行垃圾回收器(Serial Garbage Collector)-XX:+UseSerialGC
  2. 并行垃圾回收器(Parallel Garbage Collector)
  3. 并发标记扫描垃圾回收器(CMS Garbage Collector)XX:+USeParNewGC  XX:+UseConMarkSweepGC
  4. G1垃圾回收器(G1 Garbage Collector) –XX:+UseG1GC

165752_rzhy_2858486.png

Java 8 的新特性

在使用G1垃圾回收器的时候,通过 JVM参数 -XX:+UseStringDeduplication 。 我们可以通过删除重复的字符串,只保留一个char[]来优化堆内存。这个选择在Java 8 被引入。

170713_19wH_2858486.png

----------------------------------------------------------------

 

 

 

 

转载于:https://my.oschina.net/carmen001/blog/1563302

你可能感兴趣的文章
linux apt-get proxy
查看>>
Spring学习总结1——bean的生命周期
查看>>
我的友情链接
查看>>
Apache Tomcat7+MySQL5.6配置
查看>>
char varchar nvarchar区别
查看>>
iOS原生定位和反编码
查看>>
华为交换机配置命令 华为QuidWay交换机配置命令手册
查看>>
如何解决JSP页面的乱码问题
查看>>
SQL中的Null值
查看>>
细看晶圆代工之争,纳米制程是什么
查看>>
东软java实训第一个项目人力资源管理
查看>>
我的友情链接
查看>>
ESXI GLusterFS ISCSI 构建低端虚拟化解决方案
查看>>
mysql使用
查看>>
[Ubuntu 12.10] Openstack 多节点安装--前期准备&&网络拓扑
查看>>
zipkin部署
查看>>
JavaScript调用Applet的函数
查看>>
eclipse折叠所有代码快捷键
查看>>
Character
查看>>
关于visualizer的setEnabled()方法何时进行设置成false?
查看>>