Java垃圾回收(1)

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

我为什么要在乎?

您的Java虚拟机可以为您管理内存-这非常方便-但默认情况下可能未对它进行优化调整。 通过了解垃圾收集背后的一些理论,您可以更轻松地调整收集器。 一个普遍关心的问题是收集器的效率,也就是说,您的程序花了多少时间执行程序代码而不是收集垃圾。 另一个常见问题是应用程序暂停的时间长。

关于垃圾收集还有很多传闻和民间传说,因此更详细地了解算法确实有助于避免陷入常见的陷阱和陷阱。 此外,对于任何对如何应用和使用计算机科学原理感兴趣的人,JVM内部都是一件很棒的事情。

停止世界是什么意思?

您的程序(或GC-Speak中的mutator)将在运行时分配对象。 在某个时候,需要收集堆,并且热点中的所有收集器都会暂停您的应用程序。 “世界停止”一词用于表示所有增变器的线程都已暂停。

可以实现不需要暂停的垃圾回收器。 Azul已在其Zing虚拟机中实现了有效的不间断收集器。 我不会介绍它是如何工作的,但是如果您想了解更多信息,会有一张非常有趣的白皮书 。

年轻/弱世代假说

简而言之: 大多数分配的对象都死于年轻 1 。 通过对1980年代一大批程序的内存分配和活动模式进行实证分析,证明了这一概念。 研究人员发现,不仅大多数物体死于年轻,而且一旦它们活到一定年龄,它们就会活很长一段时间。 下图取自SUN / Oracle研究,以直方图的形式查看了对象的寿命。

190245

堆的组织方式如何?

年轻的世代假设催生了世代垃圾收集的思想,在世代垃圾收集中,堆被分为几个区域,每个区域中对象的放置与它们的年龄相对应。 以上这些垃圾收集器( G1除外)共有的一个要素是将堆组织到不同空间的方式。

Java内存

最初分配对象时(如果适合)将它们存储在Eden空间中。 如果对象在集合中幸存下来,那么它将最终到达幸存者空间。 如果它能够存活几次(您的使用期限阈值),则该对象最终将出现在使用期限的空间中。 收集器收集这些空间的算法的细节各不相同,因此我将在以后的博客文章中单独介绍它们。

这种划分是有益的,因为它允许您在不同的空间上使用不同的算法。 如果大多数对象都已失效,则某些GC算法效率更高;如果大多数对象都处于活动状态,则某些GC算法效率更高。 由于世代相传的假设,通常是到了在伊甸园收集大多数物体的时候,幸存者空间已经死了,而保有权的大多数物体还是活着的。

还有永久性的-永久的一代。 这是一个特殊的世代,其中包含与Java语言本身相关的对象。 例如,此处包含有关已加载类的信息。 从历史上看,被插入或为常量的字符串也保存在这里。 永久代已被删除,转而支持元空间 。

多个收藏家

热点虚拟机实际上具有各种不同的垃圾收集器。 每个都有不同的性能特征集合,并且更(或更少)适合于不同的任务。 我将要研究的关键垃圾收集器是:

  • 并行清理 (PS):最近发布的JVM中的默认收集器。 为了收集而停止运行,但是并行收集(即使用多个线程)。
  • 并发标记扫描 (CMS):此收集器具有多个阶段,其中一些阶段使世界停滞不前,但在该阶段的多个阶段也与程序同时运行。
  • 增量并发标记扫描 (iCMS):CMS的一种变体,旨在降低暂停时间。 有时可以做到这一点!
  • 垃圾优先 (G1):一种新型的收集器,最近变得更加稳定,并且使用量正在缓慢增加。

结论

我已经对垃圾收集提出了一些介绍性的观点,在下一篇文章中,我将介绍Parallel Scavenge收集器-它是当前的默认收集器。 我还想提供我的雇主链接,该雇主拥有我们认为非常有用的GC日志分析器 。

  1. “热点”是在openjdk和官方Oracle JVM之后通用的代码库的名称。 从Java 7开始,openjdk是Java SE的参考实现。
  2. 从技术上讲,我上面描述的是具有经验验证的“弱代假设”。 还有一个很强的变体,可以说是:堆分配对象的平均生存期等于可访问存储的平均数量 。 实际上,这可以通过采取利特尔定律并将Λ设置为1来从数学上证明。
  3. 我将在G1特定的博客文章中介绍G1中堆的组织方式。

参考: Insightful Logic博客上来自我们JCG合作伙伴 Richard Warburton的Java垃圾收集(1) 。

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

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

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

相关文章

少锁定Java对象池

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

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

1.要让PHP支持PostgreSQL,就需要重新编译PHP;./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…

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进程及…

python基础学习笔记(十三)

re模块包含对 正则表达式。本章会对re模块主要特征和正则表达式进行介绍。 什么是正则表达式 正则表达式是可以匹配文本片段的模式。最简单的正则表达式就是普通字符串&#xff0c;可以匹配其自身。换包话说&#xff0c;正则表达式’python’ 可以匹配字符串’python’ 。你可以…

OD debug matlab,OllyDebug基本使用方法

OD是逆向过程中最好的动态调试工具&#xff0c;这次来记录学习笔记。(特别鸣谢石总)1、OD的工作界面最开始要学的就是界面的使用N了吧&#xff0c;这里分各个框来解释下&#xff1a;列举各个框用处&#xff1a;可以看到下面一框框东西&#xff1a;这些一时半会用不到&#xff0…

设计模式:策略

这次我想谈谈策略设计模式 。 通过这种方式&#xff0c;我开始撰写有关行为设计模式的文章。 这些模式表示对象之间的某些交互模式&#xff0c;以使代码更灵活且组织得更好。此方法的最本质点是对象之间的松散耦合。 当您的应用程序中有多个实现目的的实现时&#xff0c;应使用…

本地搭建WordPress (XAMPP环境)

1&#xff0c;XAMPP是一个流行的PHP开发环境&#xff0c;官网下载&#xff1a; https://www.apachefriends.org/zh_cn/index.html 然后安装。 官方介绍&#xff1a;XAMPP是最流行的PHP开发环境 XAMPP是完全免费且易于安装的Apache发行版&#xff0c;其中包含MariaDB、PHP和Pe…

CSS3 选择器——属性选择器

上一节在《CSS3选择器——基本选择器》中主要介绍了CSS3选择器的第一部分&#xff0c;这节主要和大家一起来学习CSS3选择器的第二部分——属性选择器。属性选择器早在CSS2中就被引入了&#xff0c;其主要作用就是对带有指定属性的HTML 元素设置样式。使用CSS3属性选择器&#x…

设计模式:生成器

有时需要在应用程序中创建一个复杂的对象。 一种解决方案是Factory模式&#xff0c;另一种是Builder设计模式。 在某些情况下&#xff0c;您甚至可以结合使用这两种模式。 但是在本文中&#xff0c;我想研究一下Builder设计模式 。 我需要说的第一件事是创造模式。 在什么情况…

css平行四边形与菱形变换

*以下技巧均源自于Lea Verou所著《CSS Secrets》 平行四边形 平行四边形的构造可以基于矩形通过skew()的变形属性进行斜向拉升得到&#xff08;skew所用的坐标系&#xff0c;纵向是X轴&#xff0c;横向是Y轴&#xff0c;与常见的坐标系相反&#xff09;。 <!DOCTYPE html&g…

设计模式:原型

创新设计模式之一是原型设计模式 。 尽管原型是创造模式&#xff0c;但它在概念上与其他模式有所不同。 我的意思是原型在某种意义上创造了自己。 我将在下面解释。 原型模式的所有魔力都基于Java Object的clone&#xff08;&#xff09;方法。 因此&#xff0c;让我们考虑一…

SecureCRT连接AWS EC2云主机密码登录

申请了亚马逊的EC2&#xff0c;要通过ssh 加密钥的形式登录&#xff0c;特别麻烦&#xff0c;而且感觉ssh登录AWS的云主机后好卡&#xff0c;这里是更改成用户名和密码的形式登录云主机&#xff0c;可以通过SecureCRT直接登录 1、首先通过ssh登录到EC2&#xff0c;类似于ssh -i…

母版页

一、母版页简介 使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页&#xff08;或一组页&#xff09;定义所需的外观和标准行为。 母版之所以称为母版&#xff0c;就是将大部分网页上固定内容&#xff0c;比如导航栏&#xff0c;版…

openLayers 4 canvas图例绘制,canvas循环添加图片,解决图片闪烁问题

一、问题来源&#xff1a; 接触Openlayers 一段时间了&#xff0c;最近做了一个农业产业系统&#xff0c;项目中涉及到产业图例&#xff0c;最后考虑用canvas来绘制图例图像。当中带图片的图例移动时&#xff0c;图片会实现闪烁留白情况。闪烁是因为绘制图片本身的复杂性&#…

Java DB嵌入式模式

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。 Java DB有两个部署选项&#xff1a; Embedded和Network Server 。 这篇文章是关于嵌入式部署或模式的。 1.嵌入式 在嵌入式模式下&…

清除浮动方法解析

清除浮动方法解析 清除浮动带来的额外影响 如果对于浮动不熟悉的同学&#xff0c;可以看看介绍float的文章。传送门&#xff1a;CSS float 我们知道&#xff0c;在一个父元素内如果遇到某个浮动元素&#xff0c;此时父元素的高度会发生塌陷。针对父元素高度塌陷的问题&#xff…

进程间的通信----管道

前提&#xff1a;本文是基于Linux系统下的学习 用户态的进程是如何组织的呢&#xff1f;所有的用户态进构成了一棵树。进程树。 进程树的树根是init.也就是1号进程。是用户态进程的祖宗进程。如何查看进程树&#xff1f;pstree 进程之间的关系 父子进程和兄弟进程查看进程的信息…

web项目启动时,自动执行代码的几种方式

在项目开发过程中&#xff0c;往往需要一些功能随着项目启动而优先启动&#xff0c;下面我总结几种方式&#xff08;非spring boot&#xff09; spring boot的参考 spring boot 学习之路9 (项目启动后就执行特定方法) 方式一&#xff1a; ServletContextListener监听器&#…

设计模式:状态

本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分&#xff0c;在其中我将提供有关需要应用该模式的情况&#xff0c;它所具有的利弊以及用法示例的信息。 有时&#xff0c;当对象的内部状态更改时&#…