- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java 可视化垃圾回收_动力节点Java学院整理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
ben evans是一名资深培训师兼顾问,他在演讲可视化垃圾回收中从基础谈起讨论了垃圾回收.
以下是对其演讲的简短总结.
基础 。
当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管理和引用计数.
这是件好事,因为内存管理令人厌烦,学究式地簿记是计算机擅长的,而不是人擅长的。在这方面,语言的运行时环境比人强.
现代的垃圾回收非常高效,远远超过早期语言中典型的手工分配。通常,具有其它语言背景的人只盯着垃圾回收造成的中断,却没有完全理解自动内存管理发生作用的上下文环境.
标记&清除是java(及其它运行时环境)用于垃圾回收的基本算法.
在标记&清除算法中,引用会从每个线程栈的桢指向程序的堆。所以,从栈开始,循着指针找到所有可能的引用,然后再循着这些引用递归下去.
当递归完成,就找到了所有的活对象,其它的都是垃圾.
请注意,人们经常漏掉的一点是,运行时环境本身也有一个“分配清单(allocation list)”,上面列出了指向每个对象的指针,该列表由垃圾回收器负责维护,并帮助垃圾回收器进行垃圾清理。因此,运行时环境总是可以找出由它创建但尚未回收的对象.
图一 。
上面插图中所示的栈只是一个与单个应用程序线程相关的栈;每个应用程序线程都有一个类似的栈,每个栈本身都有一组指向堆的指针.
如果垃圾回收器试图在应用程序运行过程中获取活对象的快照,那么它就要追踪运动着的目标,那样很容易漏掉一些严重超时的对象分配,因而无法获得一个准确的快照。因此,“stop the world”是有必要的;也就是,停止应用程序线程足够长的时间,以便捕获活对象的快照.
下面是垃圾回收器必须遵循的两条黄金法则:
垃圾回收器必须回收所有的垃圾。 垃圾回收器必须从不回收任何活对象.
但这两条规则并不是对等的;如果违反了第二条规则,结果会使数据遭到破坏.
另一方面,如果违反了第一条规则,则会是另一种情况,系统并不总是能够回收所有的垃圾,但最终会回收所有的垃圾,那么这是可以接受的,而实际上,这是垃圾回收器的基本原理.
hotspot 。
现在,我们来说下hotspot,它实际上是一个c、c++以及许多特定于平台的汇编程序组成的混合体.
当人们想到解释器,就会想到一个很大的while循环,其中包含一个很长的switch语句。但hotspot解释器比那个要复杂的多(由于性能原因)。在开始阅读jdk源代码的时候,就会发现hotspot中实在是有许多汇编程序代码.
对象创建 。
java会预先分配大量的连续空间,就是我们所说的“堆”。之后,hotspot完全在用户空间里管理这块内存.
如果一个java进程占用了大量的系统(或内核)时间,那么毫无疑问,它不是在进行垃圾回收——因为所有的垃圾回收内存“簿记(bookkeeping)”都是在用户空间进行的.
内存池 。
图二 。
“永久代(permgen)”是一个存储区域,用于保存那些需要在程序生存期内一直存活的东西,如类的元数据。不过,随着应用程序服务器的出现,它们有自己的类加载器,并且需要重新加载类的元数据,永久代作为一个优化决策开始显得糟糕,所幸,它在java 8中消失了.
java 8将会使用一个名为“元空间(metaspace)”的新概念。元空间与永久代并不完全相同。它在堆的外面,由操作系统管理。这意味着,它不会在java堆中,而是在本地内存里。目前,这还不是一个非常好的消息,因为没有多少工具能够让用户轻松地查看本地内存。所以,永久代消失是件好事,但工具赶上这个变化还需要一些时间.
java堆布局 。
现在,我们来看下java堆。注意堆空间之间的虚拟空间。它们提供了一点浮动量,以允许对内存池进行一定量的尺寸调整,又不用为任何对象移动付出代价.
图三 。
“弱代假设(weak generational hypothesis)” 。
就现状而言,究竟为什么要将堆分成所有这些内存池?
图四 。
有的运行时事实无法通过静态分析推导出来。上面的插图说明有两组对象:一组存活时间短,一组存活时间长——所以,做额外的簿记以便利用这一事实是有意义的。在java平台中,有许多类似的作为优化写入平台的事实.
演示 。
ben evans进行了一系列的动画演示。第一个演示是个flash,说明了对象在eden区和一个新生代survivor空间之间移动,并最终进入老年代的过程.
图五是用javafx再现了同样的过程.
图五 。
运行时开关 。
‘强制性'参数 。
-verbose:gc——为用户输出一些gc信息 -xloggc:<文件路径>——指定日志输出路径,要确保磁盘有空间 -xx:+pringgcdetails——为辅助工具提供“最低限度信息(minimum information)” 。
——用这个参数代替-verbose:gc 。
--xx:printtenuringdistribution——“过早提升(premature promotion)”信息 基本堆大小参数-xms<size>—— 设置预留给堆的最小内存值 -xmx<size>—— 设置预留给堆的最大内存值 -xx:maxpermsize=<size>——设置永久代的最大内存值 。
——有利于spring应用程序和应用服务器 。
以前,我们被教导要把-xms和-xmx的值设的一样大。不过这已经变了。因此,现在可以为-xms设置一个合理范围内较小的值,或者根本就不设置,因为堆的适应能力现在已经非常好了.
其它参数-xx:newratio=n -xx:newsize=n -xx:maxnewsize=n -xx:maxheapfreeratio -xx:minheapfreeratio -xx:survivorratio=n -xx:maxtenuringthreshold=n 。
图六 。
为什么要有日志文件 。
日志文件的好处是能够用于取证分析,可以使用户免于为了再现问题而不得不再执行一次代码(如果是一个罕见的生产环境错误,那么重现并不容易).
另外,它们包含的信息比针对内存的jmx mxbeans所能提供的信息更多,且不说轮询jmx本身会引入一系列gc问题.
工具 。
hp jmeter(用google查询一下) 。
——免费,非常可靠,但不再提供支持/功能增强 。
gcviewer 。
——免费,开源,但界面有点丑 。
garbagecat 。
——名字最好听 。
ibm gcmv 。
——支持j9 。
jclarity censum 。
——界面最美观,而且最有用——不过,这是我们的偏见! 。
小结 。
以上所述是小编给大家介绍的java 可视化垃圾回收,希望对大家有所帮助! 。
最后此篇关于Java 可视化垃圾回收_动力节点Java学院整理的文章就讲到这里了,如果你想了解更多关于Java 可视化垃圾回收_动力节点Java学院整理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当我创建一个数据库时,我被要求选择默认排序规则,当我创建一个表时,我被要求选择排序规则。 utf8_general_ci 或...拉丁...?区分哪个是对的依据是什么? 最佳答案 A collatio
PHP不会检查单引号 '' 字符串中变量内插或(几乎)任何转义序列,所以采用单引号这种方式来定义字符串相当简单快捷。但是,双引号 "" 则不然,php会检查字符串中的变量或者转义
正则(regular),要使用正则表达式需要导入Python中的re(regular正则的缩写)模块。正则表达式是对字符串的处理,我们知道,字符串中有时候包含很多我们想要提取的信息,掌握这些处理字符
在开发过程中,有时需要对用户输入的类型做判断,最常见是在注册页面即用户名和密码,代码整理如下: 只能为中文 ?
]js正则表达式基本语法(精粹): http://www.zzvips.com/article/94068.html 许多语言,包括P
1、首先安装mongodb 1.下载地址:http://www.mongodb.org/downloads 2.解压缩到自己想要安装的目录,比如d:\mongodb 3.创建文件夹d:\mo
我更愿意在 R 中执行以下操作,但我愿意接受(易于学习的)其他解决方案。 我有多个(比如说 99 个)制表符分隔文件(我们称它们为 S1.txt 到 S99.txt)和表格,所有文件都具有完全相同的格
我制作了一个小程序,可以使用数学进行物理计算。 我有几个 if 语句,它们做同样的事情,但变量不同,但它们必须是它们,就好像 TextBox 是空的,int 将是 0。 例子如下: if (first
我正在构建需要扩展框的东西 - 这很好,我可以正常工作。然而,如果你看看这个FIDDLE你会看到它有点乱。我希望有一种方法可以扩展它们所在的盒子,这样它们就不会跳来跳去?那么盒子 3 的左侧会比右侧膨
我相当确定(在 MATLAB 中)应该有一个优雅的解决方案,但我现在想不起来。 我有一个包含 [classIndex, start, end] 的列表,我想将连续的类索引折叠成一个组,如下所示: 这个
维基百科将 XMPP 定义为: ...an open-standard communications protocol for message-oriented middleware based on
我的代码库已经进入了某种状态,希望能够摆脱它 repo 看起来有点像这样(A1、B1、C1 等显然是提交) A1 ---- A2 ---- A3 ---- A4 -
如何整理以下数据框 data.frame(a = c(1,2), values = c("[1.1, 1.2, 1.3]", "[2.1, 2.2]")) a values 1
所以我试图在 Haskell 中生成出租车号码列表。出租车号码是可以用两种不同方式写成两个不同立方体之和的数字 - 最小的是 1729 = 1^3 + 12^3 = 9^3 + 10^3 . 现在,我
我正在使用 roxygen2 来记录我正在开发的包的数据集。我知道你可以 use roxygen to document a dataset ,但是Shane's answer最终建议进行黑客攻击,虽
这个问题在这里已经有了答案: How can I combine two strings together in PHP? (19 个回答) 关闭 5 年前。 提前致歉,尽管我已经尝试并失败了几件不
我有一个大部分整洁的数据框,但有 2 列包含基准,而不是将基准合并为观察结果。我该如何整理,以便将“Facility_score”和“TTP”col_names 添加为每个独特的 FYQ 和 Metr
我有以下输入数据。每一行都是一个实验的结果: instance algo profit time x A 10 0.5 y A
我已经使用 PHP 和 MySQL 实现了搜索。目前我的表格整理是 "utf8_unicode_ci"。问题是,使用此排序规则 "ä"= "a" 是。如果我将排序规则更改为 "utf_bin" 一切正
所以我是 JS 和 Jquery 库的新手。我一直在玩弄一些东西,可以看到它非常不整洁,这就是我希望你们能帮助建议一种更好的方法来实现我想要实现的目标的地方。 目标: 要有多个复选框,其中一些如果被选
我是一名优秀的程序员,十分优秀!