Java 内存管理和垃圾回收机制

news/2024/7/20 13:48:46 标签: java, 内存管理, 运维

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

上一博内容比较杂,都是根据别人的面经整理的一些答案,有些地方写的比较浅,还需要自己去深刻理解一下。

Java 虚拟机垃圾回收机制

首先需要查看对象是否存活,需要验证。

可达性分析算法

通过一系列称为“GC Roots" 的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明这个对象是不可用的。

判断对象生存还是死亡

  1. 如果对象在进行可达性分析发现没有与GC Roots相连接的引用链,那么它将会被第一次标记兵器进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法;

  2. 当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。

垃圾收集算法

  • 标记-清除算法

首先标出需要回收的对象,在标记完成后统一回收所有被标记的对象。这种方法可能会造成内存碎片

  • 复制算法

将可用内存按容量划分为大小相等的两块,每次只使用一块。

  • 标记-整理算法

先标记,再让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

  • 分代收集算法

在新生代中,每次垃圾收集时都会有大批对象死去,只有少量存活,那就选用复制算法。而老年代中因为对象存活率高,没有额外空间对他进行分配担保,使用“标记-清理”或“标记-整理”算法进行回收。

垃圾收集器

  • Serial 收集器

Serial 收集器是最基本,历史最悠久的收集器。它是以单线程工作的收集器,当它开始工作的时候,必须暂停其他所有的工作线程,直到他收集结束。

  • ParNew 收集器

ParNew收集器是Serial收集器的多线程版本,除了使用多线程之外,其余行为都与Serial收集器完全一样。

内存分配与回收策略

几条最基本的内存分配策略

  • 对象优先在Eden分配

大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够的空间进行分配时,虚拟机将发生一次Mintor GC

  • 大对象直接进入老年代

大对象指的是需要大量连续内存空间的java对象,最典型的就是长的字符串或数组。

  • 长期存活的对象直接进入老年代

在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。

一个对象的这一辈子

我是一个普通的Java对象,我出生在Eden区,在Eden区我还看到和我长的很像的小兄弟,我们在Eden区中玩了挺长时间。有一天Eden区中的人实在是太多了,我就被迫去了Survivor区的“From”区,自从去了Survivor区,我就开始漂了,有时候在Survivor的“From”区,有时候在Survivor的“To”区,居无定所。直到我18岁的时候,爸爸说我成人了,该去社会上闯闯了。于是我就去了年老代那边,年老代里,人很多,并且年龄都挺大的,我在这里也认识了很多人。在年老代里,我生活了20年(每次GC加一岁),然后被回收。

输入图片说明

转载于:https://my.oschina.net/u/1447519/blog/1549305


http://www.niftyadmin.cn/n/1105100.html

相关文章

更改“计划任务”的图标(转)

根键位置:HKEY_LOCAL_MACHINESoftwareCLASSESCLSID{D6277990-4C6A-11CF-8D87-00AA0060F5BF}DefaultIcon修改内容:在右边的窗口中修改字符串值“(默认)”为新图标的路径。[more] 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net…

Solr 13 - 管理SolrCloud集群 (创建集合、添加副本、切割分片、更新配置)

目录 1 创建Collection、Core1.1 创建collection1.2 创建core1.3 创建操作中的参数2 删除Collection、Core、Shard3 加载Collection、Core4 查看集群状态5 添加副本(ADDREPLICA)6 切割分片(SPLITSHARD)7 操作集合别名(操作成功, 但未查出区别)8 更新集群的配置8.1 将配置文件上…

Jmeter (二十四)逻辑控制器 之 Interleave Controller

Interleave Controller----交错控制器,对于交错控制器官方文档解释的很清楚,上例子: 可以看到运行一次 Interleave Controller下的Sampler,运行一次 Interleave Controller之外的Sampler。如此不停的交错循环。 Demo2:…

FreeBSD ports的修复(转)

FreeBSD ports的修复(转)[more]习惯上用portupgrade -a命令升级全部软件包。可是近期有两个库一直跟我过不去GD和Jpeg,系统提示pkgdb.db文件的依赖性有问题,需要修复。按照提示输入pkgdb -F修复了半天,回答的问题一道道,像是考试一…

前端下载远程文件

前端网页下载远程文件可以分为以下两种形式: 打开新窗口下载在当前窗口直接下载打开新窗口下载的方法: window.open方法(打开一个弹窗):window.open(http://xxx/download?param1&param2, _blank, fullscreenno,width400,height300) 创…

使用带有Dtrace的FreeBSD(转)

使用带有Dtrace的FreeBSD(转)[more]Dtrace( Dynamic tracing ),原本是Solaris 10中的新特性。它允许用户跟踪系统内核以及用户进程。是非常优秀的诊断工具。自从OpenSolaris之后,这种特性也被移植到了FreeBSD。需要说明的是,Dtrace的操作均通过内核中的p…

更改3寸软盘的图标(转)

根键位置:HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionexplorerShell Icons修改内容:在右边的窗口中新建字符串值"6",并设其值为新图标的路径。[more] 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net…

Fedora Core 6的新特性(转)

Fedora Core 6的新特性(转)[more]  按照计划,Fedora Core 将在美国东部时间10月24日上午10:00,即北京时间今晚22:00左右正式推出FC6(但愿不要再druft了),这次FC似乎要彻底与Redhat决裂了。他们启用了新的网站——其实…