Java垃圾回收(2)

并行清理

今天,我们介绍了并行GC的工作原理。 具体来说,这是在Eden上运行Parallel Scavenge收集器,在Tenured一代中运行Parallel Mark and Sweep收集器的组合。 您可以通过传递-XX:+ UseParallelOldGC来获得此选项,尽管它是某些计算机类型的默认选项。

如果您还没有读过我的第一本有关垃圾收集的博客文章,因为这没有概述。

伊甸园和幸存者空间

在平行的扫气收集器中,使用称为半球GC的方法收集伊甸园和幸存者空间。 对象最初是在Eden中分配的,一旦Eden接近全1 ,就会触发gc的Eden空间。 这样可以识别活动物体并将其复制到活动的“幸存者空间” 2中 。 然后,它将整个Eden空间视为一个空闲的,连续的内存块,可以再次分配到该内存块中。

在这种情况下,分配过程就像切碎切达干酪一样结束。 每个块都被连续切开,然后旁边的切片将被“吞噬”。 这样做的好处是分配只需要添加指针即可。

切达干酪一块,准备分配。

切达干酪一块,准备分配。

为了识别有生命的物体,进行物体图的搜索。 搜索从一组“根”对象开始,这些对象是可以保证存在的对象,例如,每个线程都是一个根对象。 然后,搜索将找到由根集指向的对象,并向外扩展直到找到所有活动对象。 这是一个非常好的绘画作品,由Michael Triana提供

堆根

在并行清除的上下文中,并行表示收集是由同时运行的多个线程完成的。 这不应与增量GC混淆,增量式GC的收集器与程序同时运行或交错运行。 通过更好地使用现代多核CPU,并行收集可提高整体GC吞吐量。 通过为每个线程提供一组要标记的根以及对象表的一部分来实现并行性。

有两个幸存者空间,但是在任何时间点只有一个处于活动状态。 它们的收集方式与伊甸园相同。 这个想法是,当物体从伊甸园提升时,它们会被复制到活跃的幸存者空间中。 然后,当需要疏散空间时,将它们复制到非活动幸存者空间。 一旦活动幸存者空间被完全撤离,则非活动空间变为活动状态,而活动空间变为非活动状态。 这是通过将指针翻转到幸存者空间的开头来实现的,这意味着可以释放幸存者空间中的所有死对象,而只需分配给单个指针即可。

年轻一代的设计和时间权衡

由于这仅涉及复制活动对象并且指针更改,因此收集伊甸园和幸存者空间所花费的时间与活动对象的数量成比例。 这是非常重要的,因为由于世代的假设,我们知道大多数对象都死于年轻,因此释放与它们相关联的内存没有GC成本。

幸存空间的设计受到这样一种想法的启发:年轻时收集对象比收集长期使用的空间要便宜。 在几次GC运行中,以半球方式继续收集对象有助于整体吞吐量。

最后,伊甸园被组织成一个连续的空间,这使得对象分配便宜。 AC程序可能会重新使用“ malloc”命令来分配一块内存,这涉及遍历内存中的可用空间列表,以尝试找到足够大的空间。 当您使用竞技场分配器并连续分配时,您需要做的就是检查是否有足够的可用空间,然后将指针增加该对象的大小。

平行标记和扫掠

在一定数量的收藏中幸存下来的对象就进入了租用空间。 他们生存所需的次数称为“任职期限”。 使用称为标记和清除的算法,保有权集合的工作方式与Eden有所不同。 每个对象都有一个与之关联的标记位。 标记最初全部设置为false,并且在图形搜索过程中到达对象时将其设置为true。

标识活动对象的图形搜索类似于为年轻一代描述的搜索。 区别在于,它不是复制活动对象,而是对其进行标记。 之后,它可以遍历对象表并释放所有不存在的对象。 该过程由多个线程并行完成,每个线程都搜索堆的一个区域。

不幸的是,删除不活动对象的过程使使用期空间看起来像瑞士奶酪。 您会在对象所在的位置获得一些已使用的内存,以及对象之前所在的位置之间的差距。 这种碎片化对应用程序性能没有帮助,因为它使分配大于Kong大小的对象成为不可能。

Mark and Sweep之后的奶酪。

Mark and Sweep之后的奶酪。

为了减少Swiss Cheese的问题,并行标记/扫描将堆压缩到较小的位置,以尝试在占位空间的开始处连续分配活动对象。 删除后,它搜索租用空间的区域,以识别占用率低和占用率高的区域。 来自占用率较低区域的活动对象向下移至占用率较高的区域。 这些自然位于上一个压缩阶段的内存较低端。 在此阶段中,对象的移动实际上是由分配给目标区域而不是源区域的线程执行的。

低入住率的奶酪。

低入住率的奶酪。

摘要

  • 并行Scavenge将堆拆分为4个空间:伊甸园,两个幸存者空间和终身使用空间。
  • 并行Scavenge使用并行复制收集器到收集器Eden和Survivor Spaces。
  • 租用空间使用了不同的算法。 这会标记所有活动对象,删除不活动的对象,然后压缩空间/
  • 并行Scavenge具有良好的吞吐量,但是在运行时会暂停整个程序。

在第三部分中,我将介绍CMS或Concurrent-Mark-Sweep收集器的工作方式。 希望对乳制品过敏的人更容易阅读这篇文章。

  1. 从技术上讲,每个堆空间都有一个“占用阈值”,它定义了在收集发生之前允许空间达到多少。
  2. 该复制算法基于Cheney算法 。
参考: Insightful Logic博客中来自JCG合作伙伴 Richard Warburton的Java垃圾收集(2) 。

翻译自: https://www.javacodegeeks.com/2013/06/garbage-collection-in-java-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Navicat Premium创建MySQL存储过程

1、使用Navicat Premium打开创建函数向导,操作:连接名——数据库——函数——新建函数 2、选择过程——输入存储过程参数——完成(这一步可以不填写参数,编写存储过程代码的时候设置参数) 3、按照要求完成存储过程代码…

CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

一、盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin)、边框&#xff…

mysql中将某个字段做计算,mysql创建计算字段使用子查询教程

作为计算字段使用子查询使用子查询的另一方法是创建计算字段。假如需要显示 customers表中每个客户的订单总数。订单与相应的客户ID存储在 orders 表中。为了执行这个操作,遵循下面的步骤。(1) 从 customers 表中检索客户列表。(2) 对于检索出的每个客户&#xff0c…

像Java这样的C ++具有低延迟

总览 以前,我写过一篇有关Java之类的C的文章。 这是我以前遇到的术语。 但是,经过思考,我认为像Java这样的C 是一个更好的术语,因为您仍在使用OOP做法(不是C风格的),但是您需要自己进行更多的工…

项目一总结

1、编程逻辑不明确的问题 在项目开始阶段,项目分工应根据项目模块进行详细分工,公用部分应尽量节省时间 2、对于文件命名规则的定义,现在项目名字命名很乱,在项目整合时会出很多问题 3、文件目录不清晰,条理性差 4、代…

Android GreenDao使用教程

一、Greendao简介 Greendao是一款用于数据库创建与管理的框架,由于原生SQLite语言比较复杂繁琐,使得不少程序员不得不去学习SQLite原生语言,但是学习成本高,效率低下,所以不少公司致力于开发一款简单的数据库管理框架&…

matlab如何将相近的数据,matlab新手,求帮助!主要是如何将数据和公式导入

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是别人给我的程序,我想问一下怎么把我的两个excel数据导入,以及公式怎么写?clc;clear all;close all;datadlmread(all_data_in_situ_lxz.txt);data(6,:)[];data(12,:)[];data(13,:)[];data(13,…

Java垃圾回收(1)

这是有关垃圾收集(GC)的系列文章中的第一篇。 我希望能够涵盖整个系列过程中的理论知识以及热点虚拟机中的所有主要收集器。 这篇文章仅说明什么是垃圾回收,以及不同回收器共有的元素。 我为什么要在乎? 您的Java虚拟机可以为您管…

如果

(最近遇到了一些困难,这篇翻译自己一直就很喜欢,贴上来鼓励自己。) 如果 吉卜林【英】芮成钢【译】 如果,身边的人都失去理智,并将其归咎于你, 而你却能保持清醒; 如果,所…

深入c#的string类

一.字符串常用方法 1.IndexOf("") 如果找到字符串出现的位置则为索引位置,否则返回-1,索引从0开始 2.string Substring( int startIndex , int length ); 从开始位置startIndex,截取到结束位置(截取长度length&#xff…

go语言服务器连接mysql,服务器mysql怎么配置才能远程连接

如何设置MYSQL服务器允许远程连接?如果你使用的与数据库不在同一台服务器上电脑,那么MySQL 服务器就需要允许远程链接,网站才能正常运行。那么如何设置MYSQL服务器允许远程连接呢?我想这是很多人都想提出的疑问,下面是…

h1、h2、h3标签及strong标签对页面seo的影响

今天和大家来聊下h1,h2,h3,strong几个标签&#xff0c;在网页中的使用对页面seo的影响&#xff0c;也阐述了个人的一些想法。 首先简要讲下H标签及strong标签的含义&#xff1a;<h1>、<h2>、<h3>、<h4>、<h5>、<h6>,作为标题使用&#x…

少锁定Java对象池

自从我写任何东西以来已经有一段时间了&#xff0c;我一直在忙于我的新工作&#xff0c;该工作涉及在性能调整方面做一些有趣的工作。 挑战之一是减少应用程序关键部分的对象创建。 尽管Java随着时间的推移改进了GC算法&#xff0c;但垃圾回收打h一直是Java的主要难题。 Azul是…

Java (数组的遍历,for循环的使用)

/*多行注释的快捷键&#xff1a;Ctrlshift/ 快速格式化代码快捷键&#xff1a;Ctrlshiftf 自动导入一个包&#xff1a;Ctrlshifto */ package test_1;public class Day_2 {public static void main(String args[]) {//一个九九乘法表的实现int c 0;for (int a 1; a < 9; a…

php数据库postgresql,PHP 操作 PostgreSQL数据库

1.要让PHP支持PostgreSQL&#xff0c;就需要重新编译PHP&#xff1b;./configure --prefix/usr/local/php5 --with-apxs2/usr/local/apache2/bin/apxs --with-mysql/usr/local/mysql --with-config-file-path/usr/local/php5 --with-zlib --enable-mbstringall --with-mysql…

开始学习前端开发吧

据说最好的输入是输出&#xff0c;所以听我讲给你听我学到的东西吧。 学习前端入门时&#xff0c;无论在哪儿都告诉我们&#xff0c;要学习HTML CSS JS。google之&#xff0c;得到html是超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称…

Java 8 Lambda演练

在工作中&#xff0c;我做了关于Java 8项目lambda的演示&#xff0c;当然还有一些简单的代码来说明其中的一些要点。 Java 8的总体原因是&#xff1a; 更简洁的代码&#xff08;适用于只有一种方法和集合的类&#xff09;。 “我们希望代码的读者在到达lambda表达式的“实质”…

虚拟机vmnet0、vmnet1和vmnet8的区别

vmnet0&#xff0c;实际上就是一个虚拟的网桥 vmnet0&#xff0c;实际上就是一个虚拟的网桥&#xff0c;这个网桥有很若干个端口&#xff0c;一个端口用于连接你的Host&#xff0c;一个端口用于连接你的虚拟机&#xff0c;他们的位置是对等的&#xff0c;谁也不是谁的网关。所以…

uestc summer training #2

A 增广 #include<bits/stdc.h> using namespace std; const int MAXN 1000000 10; vector<int> g[MAXN]; int a[MAXN], b[MAXN], sz[MAXN], cnt[MAXN]; bool mg[MAXN], vis[MAXN]; int n, m; bool dfs(int u, int f -1) {if (g[u].empty()) //如果当前数没有位…

mysql有实例名这个概念,MySQL的一些概念笔记

1.MySQL Server、MySQL实例、MySQL数据库MySQL数据库指的是实际存在的物理操作系统文件的集合&#xff0c;也可以指逻辑数据的集合。为了访问、处理数据&#xff0c;我们需要一个数据库管理系统&#xff0c;也就是MySQL Server(也称为MySQL服务器)。MySQL实例指的是MySQL进程及…