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,一经查实,立即删除!

相关文章

如果

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

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

OpenHFT Java Lang项目

OpenHFT / Java Lang从Apache 2.0库开始&#xff0c;提供Java Chronicle使用的低级功能&#xff0c;而无需持久存储到文件中。 这允许对数据进行可序列化和反序列化&#xff0c;以及对本机空间&#xff08;堆外&#xff09;中的内存的随机访问。它支持使用对象池写入和读取可枚…

spring cloud-spring boot 文档信息

官网&#xff1a; spring boot springcloud 学习资源 使用IDEA创建SpringBoot项目 Spring Boot教程 https://blog.csdn.net/forezp/article/details/70341818 Spring Cloud教程 http://blog.csdn.net/forezp/article/details/70148833 Spring Cloud教程 http://blog.csdn.net…

python基础学习笔记(十三)

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

OD debug matlab,OllyDebug基本使用方法

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

设计模式:策略

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

css 学习整理

1、 background-attachment :fixed 属性防止背景图片这种滚动&#xff0c;它默认值是 scroll&#xff0c;也就是说&#xff0c;在默认的情况下&#xff0c;背景会随文档滚动2、font-weight 属性设置文本的粗细&#xff08;关键字 100 ~ 900 为字体指定了 9 级加粗度。如果一个字…

php抓取网页中的内容

以下就是几种常用的用php抓取网页中的内容的方法。1.file_get_contentsPHP代码代码如下:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>&g…

本地搭建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…