我的编程空间,编程开发者的网络收藏夹
学习永远不晚

深入浅析Java 中的可视化垃圾回收机制

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

深入浅析Java 中的可视化垃圾回收机制

这期内容当中小编将会给大家带来有关深入浅析Java 中的可视化垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

基础

当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管理和引用计数。

这是件好事,因为内存管理令人厌烦,学究式地簿记是计算机擅长的,而不是人擅长的。在这方面,语言的运行时环境比人强。

现代的垃圾回收非常高效,远远超过早期语言中典型的手工分配。通常,具有其它语言背景的人只盯着垃圾回收造成的中断,却没有完全理解自动内存管理发生作用的上下文环境。

标记&清除是Java(及其它运行时环境)用于垃圾回收的基本算法。

在标记&清除算法中,引用会从每个线程栈的桢指向程序的堆。所以,从栈开始,循着指针找到所有可能的引用,然后再循着这些引用递归下去。

当递归完成,就找到了所有的活对象,其它的都是垃圾。

请注意,人们经常漏掉的一点是,运行时环境本身也有一个“分配清单(allocation list)”,上面列出了指向每个对象的指针,该列表由垃圾回收器负责维护,并帮助垃圾回收器进行垃圾清理。因此,运行时环境总是可以找出由它创建但尚未回收的对象。

深入浅析Java 中的可视化垃圾回收机制

图一

上面插图中所示的栈只是一个与单个应用程序线程相关的栈;每个应用程序线程都有一个类似的栈,每个栈本身都有一组指向堆的指针。

如果垃圾回收器试图在应用程序运行过程中获取活对象的快照,那么它就要追踪运动着的目标,那样很容易漏掉一些严重超时的对象分配,因而无法获得一个准确的快照。因此,“Stop the World”是有必要的;也就是,停止应用程序线程足够长的时间,以便捕获活对象的快照。

下面是垃圾回收器必须遵循的两条黄金法则:

垃圾回收器必须回收所有的垃圾。 垃圾回收器必须从不回收任何活对象。

但这两条规则并不是对等的;如果违反了第二条规则,结果会使数据遭到破坏。

另一方面,如果违反了第一条规则,则会是另一种情况,系统并不总是能够回收所有的垃圾,但最终会回收所有的垃圾,那么这是可以接受的,而实际上,这是垃圾回收器的基本原理。

HotSpot

现在,我们来说下HotSpot,它实际上是一个C、C++以及许多特定于平台的汇编程序组成的混合体。

当人们想到解释器,就会想到一个很大的while循环,其中包含一个很长的switch语句。但HotSpot解释器比那个要复杂的多(由于性能原因)。在开始阅读JDK源代码的时候,就会发现HotSpot中实在是有许多汇编程序代码。

对象创建

Java会预先分配大量的连续空间,就是我们所说的“堆”。之后,HotSpot完全在用户空间里管理这块内存。

如果一个Java进程占用了大量的系统(或内核)时间,那么毫无疑问,它不是在进行垃圾回收——因为所有的垃圾回收内存“簿记(bookkeeping)”都是在用户空间进行的。

内存池

深入浅析Java 中的可视化垃圾回收机制

图二

“永久代(PermGen)”是一个存储区域,用于保存那些需要在程序生存期内一直存活的东西,如类的元数据。不过,随着应用程序服务器的出现,它们有自己的类加载器,并且需要重新加载类的元数据,永久代作为一个优化决策开始显得糟糕,所幸,它在Java 8中消失了。

Java 8将会使用一个名为“元空间(Metaspace)”的新概念。元空间与永久代并不完全相同。它在堆的外面,由操作系统管理。这意味着,它不会在Java堆中,而是在本地内存里。目前,这还不是一个非常好的消息,因为没有多少工具能够让用户轻松地查看本地内存。所以,永久代消失是件好事,但工具赶上这个变化还需要一些时间。

Java堆布局

现在,我们来看下Java堆。注意堆空间之间的虚拟空间。它们提供了一点浮动量,以允许对内存池进行一定量的尺寸调整,又不用为任何对象移动付出代价。

深入浅析Java 中的可视化垃圾回收机制

图三

“弱代假设(Weak Generational Hypothesis)”

就现状而言,究竟为什么要将堆分成所有这些内存池?

深入浅析Java 中的可视化垃圾回收机制

图四

有的运行时事实无法通过静态分析推导出来。上面的插图说明有两组对象:一组存活时间短,一组存活时间长——所以,做额外的簿记以便利用这一事实是有意义的。在Java平台中,有许多类似的作为优化写入平台的事实。

演示

Ben Evans进行了一系列的动画演示。第一个演示是个Flash,说明了对象在Eden区和一个新生代Survivor空间之间移动,并最终进入老年代的过程。

图五是用JavaFX再现了同样的过程。

深入浅析Java 中的可视化垃圾回收机制

图五

运行时开关

‘强制性'参数

-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

深入浅析Java 中的可视化垃圾回收机制

图六

为什么要有日志文件

日志文件的好处是能够用于取证分析,可以使用户免于为了再现问题而不得不再执行一次代码(如果是一个罕见的生产环境错误,那么重现并不容易)。

另外,它们包含的信息比针对内存的JMX MXBeans所能提供的信息更多,且不说轮询JMX本身会引入一系列GC问题。

工具

HP JMeter(用Google查询一下)

——免费,非常可靠,但不再提供支持/功能增强

GCViewer

——免费,开源,但界面有点丑

GarbageCat

——名字最好听

IBM GCMV

——支持J9

jClarity Censum

——界面最美观,而且最有用——不过,这是我们的偏见!

上述就是小编为大家分享的深入浅析Java 中的可视化垃圾回收机制了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

深入浅析Java 中的可视化垃圾回收机制

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入浅析Java 中的可视化垃圾回收机制

这期内容当中小编将会给大家带来有关深入浅析Java 中的可视化垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基础当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管
2023-05-31

深入浅析JS中的垃圾回收机制

基本类型存放在栈中,引用类型存放在堆中。JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。
2023-05-14

深入了解JavaScript中的垃圾回收机制

JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间。本文主要介绍了JS中垃圾回收机制的相关知识,需要的可以参考一下
2023-05-15

Java中的垃圾回收机制是如何工作的?如何优化Java的垃圾回收?(Java的垃圾回收器如何运作?有哪些策略可以优化Java的垃圾回收性能?)

Java垃圾回收机制通过根引用扫描、图遍历、标记和清除过程回收不再使用的对象。优化策略包括减少对象分配、使用大对象、避免循环引用、调整GC参数和使用最新JVM版本。监控GC性能并根据特定需求优化策略至关重要。
Java中的垃圾回收机制是如何工作的?如何优化Java的垃圾回收?(Java的垃圾回收器如何运作?有哪些策略可以优化Java的垃圾回收性能?)
2024-04-02

如何深入Java核心探秘Java垃圾回收机制

这期内容当中小编将会给大家带来有关如何深入Java核心探秘Java垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。垃圾收集GC(Garbage Collection)是Java语言的核心技术之一
2023-06-17

深入理解Go语言中的垃圾回收机制

Go语言中的垃圾回收(GC)机制是自动进行的,开发者不需要手动管理内存。这种自动化垃圾回收机制可以帮助开发者降低内存泄漏的风险,并减轻程序员的负担。Go语言中的垃圾回收机制是基于标记-清除(mark and sweep)算法的,并且使用了三
2023-10-08

如何分析Java性能优化中的垃圾回收机制

这篇文章将为大家详细讲解有关如何分析Java性能优化中的垃圾回收机制,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。★JVM 的内存空间  在 Java 虚拟机规范中,提及了如下几种类型的内存
2023-06-02

Android之java的GC垃圾回收机制详解-层层分析步步深入

垃圾回收机制大家应该都有所了解,它不仅是面试的常客,也是Java体系中相当重要的一块知识。深入理解Java的GC机制,不仅有助于我们在开发中提高程序的性能,更有了在面试官面前炫技的资本。本篇文章将全面且深入的分析JVM的垃圾回收机制,进行讲

JVM中垃圾回收机制的示例分析

这篇文章主要介绍了JVM中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。堆内存的划分分为三个部分(以下名词表示同一个区):新生区、新生代、年轻代养老区、
2023-06-29

java中的垃圾回收机制以及经典垃圾回收器的详细介绍

本篇内容介绍了“java中的垃圾回收机制以及经典垃圾回收器的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!判断对象存活方法引用计数法
2023-06-20

PHP中垃圾回收机制的示例分析

小编给大家分享一下PHP中垃圾回收机制的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!如果用过C语言,那么申请内存的方式是malloc或者是calloc,
2023-06-15

kubernetes中垃圾回收机制的示例分析

这篇文章主要介绍了kubernetes中垃圾回收机制的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:前言Kubernetes系统在长时间运行后,Kubernete
2023-06-04

深入剖析Go语言垃圾回收机制的原理与应用

Go语言的垃圾回收机制是一种自动的内存管理机制,它通过解决内存分配和回收的问题,使得开发者无需显式地管理内存,可以更专注于业务逻辑的实现。Go语言的垃圾回收机制基于三色标记算法,其原理如下:1. 标记阶段:垃圾回收器从根对象开始,通过遍历根
2023-10-08

Java中的垃圾回收机制,你知道几个?

Java 的垃圾回收机制是一个复杂而高效的内存管理系统,通过不同的算法和策略,可以最大限度地提高内存利用率,降低内存管理的复杂性。

深入研究Go语言的垃圾回收器管理机制

Go语言的垃圾回收器是一种自动管理内存的机制,它负责在运行时检测和回收不再使用的内存,以避免内存泄漏和悬空指针等问题。Go语言的垃圾回收器采用了标记-清除(mark and sweep)算法。具体来说,它分为三个主要的阶段:标记阶段、清除阶
2023-10-08

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录