java 可视化_可视化Java垃圾收集

java 可视化

像西洋双陆棋一样,垃圾收集需要花费几分钟的时间来学习,并且需要终生掌握。

在他的演讲“ 可视化垃圾收集”中,高级培训师/顾问Ben Evans从头开始讨论GC。

以下是他的演讲的简短摘要。

基本

当释放不再使用的内存时,GC在很大程度上取代了早期的技术,例如手动内存管理和引用计数。

这是一件好事,因为内存管理很无聊,计算机擅长的书呆子簿记,而人们却没有。 语言运行时在这方面比人类要好。

现代GC效率很高,远远超过早期语言中典型的手动分配。 来自其他语言背景的人们经常专注于GC暂停,而没有完全了解自动内存管理所处的环境。

Mark&Sweep是Java(和其他运行时)用于GC的基本算法。

在“标记和扫描”算法中,您具有从每个堆栈线程的框架指向的引用,这些引用指向程序堆。 因此,我们从堆栈开始,遵循指向所有可能引用的指针,然后递归地遵循这些引用。

完成后,您将拥有所有活动对象,而其他所有内容都是垃圾。

请注意,人们经常会忘记的一点是,运行时本身还具有指向每个对象的指针列表,称为“分配列表”,该列表由垃圾收集器维护并有助于垃圾收集器进行清理。 因此,运行时始终可以找到它创建但尚未收集的对象。

图1

上图中所示的堆栈只是与单个应用程序线程相关联的堆栈。 每个应用程序线程都有一个类似的堆栈,并且具有指向堆栈的自己的一组指针。

如果垃圾收集器试图获取应用程序运行时生活的快照,那么它将追逐一个移动的目标,并且很容易错过一些时间不正确的对象分配,并且无法获得准确的快照。 因此,有必要“停止世界”; 即停止应用程序线程足够长的时间以捕获活动对象快照。

垃圾收集器必须遵守两个黄金法则:

  1. 垃圾收集器必须收集所有垃圾。
  2. 垃圾收集器绝不能收集任何活动对象。

但是这些规则并不是平等的。 如果违反了规则2,则最终将导致数据损坏。

另一方面,如果违反了规则1,相反,我们有一个系统不能一直收集所有垃圾,而是最终只收集它,那么这是可以容忍的,实际上可以作为基础垃圾收集器。

热点

现在让我们谈谈HotSpot,它实际上是C和C ++的集合以及许多特定于平台的汇编程序。

人们想到口译员时,会想到带有大型switch语句的大型while循环。 但是HotSpot解释器要复杂得多(出于性能原因)。 当您开始查看JDK源代码时,就会意识到Hotspot中有多少汇编程序代码。

对象创建

在Java中,我们预先分配了大量连续的空间,这就是我们所说的“堆”。 然后,由HotSpot完全在用户空间中管理此内存。

如果您看到Java进程正在使用大量的系统(或内核)时间,那么您可以放心,它不会进行垃圾回收-因为我们所有的GC内存簿记都是在用户空间中完成的。

内存池

图2

PermGen是诸如类元数据之类的东西的存储区域,这些东西在程序的生命周期中需要保持活动状态。 但是,随着具有自己的类加载器并需要重新加载类元数据的应用服务器的出现,PermGen开始看起来像是一个糟糕的优化决策,幸运的是,在Java 8中该决策已不复存在。

将使用一个称为“元空间”的新概念,它与PermGen并不完全相同。 元空间在堆之外,并且由操作系统管理。 这意味着它将不进入Java堆,而是进入本机内存。 目前,这并不是一个好消息,因为没有太多工具可以让您轻松查看本机内存。 因此,PermGen消失是一件好事,但是要赶上该工具还需要一些时间。

Java堆布局

现在让我们看一下Java堆。 注意堆空间之间的虚拟空间。 这些提供了一些摆动,可以在不损失移动所有内容的代价的情况下调整池的大小。

图3

弱代假设

现在,为什么我们实际上将堆分成所有这些内存池?

图4

有些运行时事实无法通过静态分析得出。 上图说明了两组对象: 那些早逝的人和活了很久的人-因此有必要进行额外的簿记以利用这一事实。 Java平台上充斥着类似的事实,这些事实已作为优化被编入平台。

演示版

一系列动画的 演示 进行 。 Flash中的第一个演示说明了伊甸园和年轻一代幸存者空间之间的运动,最后演变为终身制。

图5呈现了相同的JavaFX。

图5

运行时开关

强制性标志

  • -verbose:gc –给我一些GC输出
  • -Xloggc:<pathtofile> –日志输出的路径,请确保您有磁盘空间
  • -XX:+ PrintGCDetails –帮助工具的最少信息

–替换-verbose:gc与此

  • -XX:+ PrintTenuringDistribution –过早的促销信息

基本堆大小标志

  • -Xms <size> –设置为堆保留的最小大小
  • -Xmx <size> –设置为堆保留的最大大小
  • -XX:MaxPermSize = <大小> –设置perm生成的最大大小–适用于Spring应用程序和App服务器

在过去,我们被教导将–Xms设置为与–Xmx相同的值。 但是,这种情况已经改变。 现在,您可以将–Xms设置为相当小的值,或者根本不设置它,因为堆自适应性现在非常好。

其他标志

  • -XX:NewRatio = N
  • -XX:NewSize = N
  • -XX:MaxNewSize = N
  • -XX:MaxHeapFreeRatio
  • -XX:MinHeapFreeRatio
  • -XX:SurvivorRatio = N
  • -XX:MaxTenuringThreshold = N

图6

为什么要记录文件

日志文件的优点是可以用于法医分析,这可以使您不必再次运行代码即可重现问题(如果这是罕见的生产错误,则不容易)。

与JMX MXBean相比,它们还具有更多的内存信息,更不用说轮询JMX会引入其自身的GC问题集。

工装

  • HP JMeter(Google it)

–免费,相当可靠,但不再受支持/增强

–免费,OSS,但有点难看

–最好的名字

– J9支持

–最漂亮,最有用–但是我们有偏见!

综上所述

  • 您需要了解一些基本的GC理论
  • 您希望大多数物体在年轻一代中死掉
  • 打开GC日志记录! –读取原始日志文件很困难–使用工具
  • 使用工具来帮助您进行调整 –衡量,不要猜测

在这里您可以访问完整的演示文稿。

翻译自: https://www.infoq.com/articles/Visualizing-Java-Garbage-Collection/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

java 可视化

用来完成大作业的。文档内容: 1 Java技术体系 1.1 Java语言 1.2 Java平台 1.3 Java应用领域 2 Java语言的技术特点 2.1 1 2.2 2 2.3 3 3 Java语言与C++的异同分析总结。 4 选用C和java语言时编程算法程序有什么不同,有什么优势和劣势。 5 自己编程学习的级别和状态。以及自己以后的编程学习的计划和想法。 6 下面3道题目中选一道,给出算法分析和程序。 1)“黄金分割数”在我们的生活中很常见,但是在不同的应用领域,要求的精度也不一样。 例如:三位小数是0.618 现在我们需要你能求出保留100位小数的黄金分割数,采用的算法为“分层计算法”: 黄金数= 1 --------------- 1+ 1 ------------- 1+ 1 ----------- 1+ 1 --------- ..... 注意,计算出的结果,如果第100位为0也需要保留。 2)已知一个数列: 5,2,4,3,7,6 那么,在这个数列中存在这样一些“连续数”,例如:5,2,4,3这个子数列排序后是连续的。同样2,4,3也是连续的,为了方便表示 我们使用下标来标识,这样,这个数列中存在以下“连续数”: [1,1] [1,4] [1,6] [2,2] [2,4] [3,3] [3,4] [4,4] [5,5] [5,6] [6,6] 这样,他就存在11个“连续数”。现在需要你在用户找出一个数组中所有的“连续数”。 要求: 1、用户输入一个整数N,表示下面数组的个数 2、用户每输入一行作为一个数组 如: 用户输入: 1 5,2,4,3,7,6 程序输出: 11 3)有一种数我们称之为幸运数,它的特点是这样的,首先,由自然数按顺序排列: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 … 这样,1比较特殊, 1为第一个幸运数,那么,我们移除掉序号能被2整除的数(注意:是序号,而不是数本身,每次移除后都重新排序)就剩下: 1 3 5 7 9 11 13 15 17 19… 3为第二个幸运数,那么我们需要去掉序号能被3(下一次是除4,然后是5,每次加1)整除的数,5 11 17...剩下: 1 3 7 9 13 15 19… 那么7为第三个幸运数,后面的幸运数,依此类推,移除之后剩下的数字都是幸运数。 现在我们需要你求出给定的m和n之间的幸运数的个数: 例如:给定1 20,那么个数为:5(5个幸运数分别是1,3,7,13,19) 现在要求用户输入两个数m和n(m<n<=1000*1000),输出幸运数的个数。 例如: 用户输入: 1 20 程序输出: 5 格式:小四,1.5倍行距
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值