Sweep

JVM垃圾回收机制是怎样的,何时触发YoungGC或FullGC操作?

点点圈 提交于 2021-01-03 00:17:04
听说微信搜索《Java鱼仔》会变更强哦! 本文收录于 JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)关于垃圾回收 JAVA的垃圾回收需要完成三件事情: 1、哪些内存需要回收 2、什么时候回收 3、如何回收 下面就从这三个问题出发去了解Java的垃圾回收机制。 (二)哪些垃圾需要回收 在垃圾回收之前,首要的问题是确定哪些垃圾需要被回收,现在Java通过根搜索算法(GC Roots Tracing)来判断一个对象是否存活,这个算法的思路就是通过一系列名为“ GC Roots ”的对象作为起始点,从这些节点向下搜索,当GC Roots到达不了这个某个对象时(或者说某个对象没有被任何其他对象所引用),就证明这个对象是不可用的,这些对象会被判定为需要回收的对象。 如图,ObjC是不可达的,这个对象就是需要被回收的对象。 在Java语言中,可作为GC Roots的对象包括下面这些: 1、虚拟机栈(栈帧中的本地变量表)中引用的对象 2、方法区中的类静态属性引用的对象 3、方法区中的常量引用的对象 4、本地方法栈(Native方法)引用的对象 (三)什么时候回收 关于如何回收的问题,我参考了《深入理解Java虚拟机》,根搜索算法中不可达的对象,并不是立刻就会被回收,而是会经过一次标记: 如果对象没有覆盖finalize()方法,或者finalize(

java gc

瘦欲@ 提交于 2020-12-28 08:06:40
Garbage Collection 自动垃圾回收即在堆空间中识别被引用的对象以及未被引用的对象, 然后删除未被引用的对象的过程。 基本步骤: Marking(标记): 识别被引用的对象, 以及未被引用的对象。 所有的对象都会被扫描。 Normal Deletion(正常删除): 删除未被引用的对象, 引用的对象会被保留, 并且memory allocator会保存空闲块的引用。 或: Deletion with Compacting(删除并压缩): 删除未被引用的对象, 把被引用的对象移动到一起, 方便后面的内存分配。 Generatiional Garbage Collection 标记并压缩对象是不够高效的, 并且多数对象只存活很短的时间, 因此就有了Generational Garbage Collection。 由此, Java堆被分成了三块:新生代, 老年代和永生代, 其中新生代被分为eden, s0, s1三块。 新生代是对象被新建以及变老的地方, 当新生代空间被填满时就会运行minor garbage collection(小型垃圾回收)。 老年代是存储存活时间较长的对象的地方, 基本上jvm会为新生代的对象设置一个阈值, 当新生代的对象经历过指定的次数没有被回收就会被移入老年代。 老年代运行的垃圾回收叫做major garbage collection

JVM GC耗时频频升高,这次排查完想说:还有谁?

喜你入骨 提交于 2020-12-22 04:58:31
来源:https://blog.csdn.net/flysqrlboy/article/details/88679457 1. 背景 1.1 多个业务线的应用出现LongGC告警 最近一段时间,经常收到CAT报出来的Long GC告警(配置为大于3秒的为Longgc)。 2. 分析前的一些JVM背景知识回顾 2.1 JVM堆内存划分 新生代(Young Generation) 新生代内被划分为三个区:Eden,from survivor,to survivor。大多数对象在新生代被创建。Minor GC针对的是新生代的垃圾回收。 老年代(Old Generation) 在新生代中经历了几次Minor GC仍然存活的对象,就会被放到老年代。Major GC针对的是老年代的垃圾回收。本文重点分析的CMS就是一种针对老年代的垃圾回收算法。另外Full GC是针对整堆(包括新生代和老年代)做垃圾回收的。 永久代(Perm) 主要存放已被虚拟机加载的类信息,常量,静态变量等数据。该区域对垃圾回收的影响不大,本文不会过多涉及。 2.2 CMS垃圾回收的6个重要阶段 initial-mark 初始标记(CMS的第一个STW阶段),标记GC Root直接引用的对象,GC Root直接引用的对象不多,所以很快。 concurrent-mark 并发标记阶段,由第一阶段标记过的对象出发

JVM GC耗时频频升高,我来教你排查

好久不见. 提交于 2020-12-22 00:13:32
1. 背景 多个业务线的应用出现LongGC告警 最近一段时间,经常收到CAT报出来的Long GC告警(配置为大于3秒的为Longgc)。 2. 知识回顾 2.1 JVM堆内存划分 新生代(Young Generation) 新生代内被划分为三个区:Eden,from survivor,to survivor。大多数对象在新生代被创建。Minor GC针对的是新生代的垃圾回收。 老年代(Old Generation) 在新生代中经历了几次Minor GC仍然存活的对象,就会被放到老年代。Major GC针对的是老年代的垃圾回收。本文重点分析的CMS就是一种针对老年代的垃圾回收算法。另外Full GC是针对整堆(包括新生代和老年代)做垃圾回收的。 永久代(Perm) 主要存放已被虚拟机加载的类信息,常量,静态变量等数据。该区域对垃圾回收的影响不大,本文不会过多涉及。 2.2 CMS垃圾回收的6个重要阶段 1、initial-mark 初始标记(CMS的第一个STW阶段),标记GC Root直接引用的对象,GC Root直接引用的对象不多,所以很快。 2、concurrent-mark 并发标记阶段,由第一阶段标记过的对象出发,所有可达的对象都在本阶段标记。 3、concurrent-preclean 并发预清理阶段,也是一个并发执行的阶段。在本阶段,会查找前一阶段执行过程中

面试官还敢问你JVM调优问题,把这篇文章甩给他!

淺唱寂寞╮ 提交于 2020-12-16 16:55:32
目录 JVM调优 概念 基本垃圾回收算法 垃圾回收面临的问题 分代垃圾回收详述1 分代垃圾回收详述2 典型配置举例1 典型配置举例2 新一代的垃圾回收算法 调优方法 反思 一、JVM调优的一些概念 数据类型 Java虚拟机中,数据类型可以分为两类: 基本类型 和 引用类型 。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括: 类类型 , 接口类型 和 数组 。 堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中, 一个空Object对象的大小是8byte ,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: Object ob = new Object(); 这样在程序中完成了一个Java对象的生命,但是它所占的空间为: 4byte+8byte 。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息

6款免费网络延迟测试工具

梦想的初衷 提交于 2020-12-15 08:54:26
点击关注上方“ 开源Linux ”, 后台回复“ 读书 ”,有我为您特别筛选书籍资料~ 作为网络管理员或网络工程师,时刻关注网络的交付速度至关重要。不仅需要确保自己有良好的响应时间,还需要确保网络的速度足以满足用户通信所需的每一条路径。而手动测试每个路径将占用你所有的时间。所以需要获得一个测试工具,以确保延迟不会影响网络的性能。 什么是延迟? 延迟是网络流量的速度指标。可接受的传输时间根据使用的应用而变化。视频播放和交互式VoIP呼叫需要比电子邮件传送更快的速度。因此,需要根据你为用户提供的服务计算出网络流量所需的速度。 测量延迟 延迟以毫秒(ms)为单位。但是,有两个指示延迟的指标。无论你选择在网络上进行测试,都要尝试将所有记录保存在同一测试类别中。 最常见的延迟测量称为“往返时间”(RTT)。顾名思义,这是数据包从网络上的一个点到另一个点所需的时间。另外一个测量指标称为“第一个字节的时间”(TTFB)。这记录了数据包的第一部分离开网络上的一个点的时刻与它到达目的地的时间之间的时间差。RTT的使用频率高于TTFB,因为它可以从一个位置运行,不需要在远程目标上安装特殊的数据收集软件。 使用Ping 每台连接网络的计算机都有一个内置于操作系统中的免费延迟测试工具,称为Ping。此工具适用于IP层协议,即Internet控制消息协议(ICMP)。每个网络管理员都使用Ping

一次超诡异的FGC,这个原因找了好久!

你说的曾经没有我的故事 提交于 2020-12-12 09:59:57
正撸着代码,内部聊天工具弹出一条信息: “ 狼哥,我这个机器总是频繁FGC...快帮我看看 ” 我打开对话框,机智的回复一个表情 继续默默撸码 随后,小伙伴砸了一段GC日志过来 2019-09-17T20:33:57.889+0800: 4753520.554: [Full GC (Metadata GC Threshold) 4753520.554: [CMS[YG occupancy: 723220 K (1887488 K)]4753520.988: [weak refs process ing, 0.0042134 secs]4753520.992: [class unloading, 0.0987343 secs]4753521.091: [scrub symbol table, 0.0237609 secs]4753521.115: [scrub string table, 0.0025983 s ecs]: 145423K->141376K(3354624K), 0.6260023 secs] 868644K->864597K(5242112K), [Metaspace: 128179K->128179K(1234944K)], 0.6264315 secs] [Times: user=1.24 sys=0.0 0, real=0.63 secs]4159962

jvm垃圾回收算法

廉价感情. 提交于 2020-12-03 15:28:13
前言 java相较于c、c++语言的优势之一是自带垃圾回收器,程序开发人员不用手动管理内存,内存的分配和释放完全由gc(Garbage Collector)来做,极大地提高了软件开发效率及程序健壮性(手动管理内存容易造成内存泄漏)。凡事皆有两面性,java gc在给我们带来内存管理便捷性的同时,也面临STW(Stop The World)影响程序吞吐的缺陷。作为java开发人员,只有深入理解jvm垃圾回收的机制,才能在程序性能出现瓶颈时,更好的对程序进行优化。 欢迎学Java和大数据的朋友们加入java架构交流: 855835163 群内提供免费的架构资料还有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的免费直播讲解 可以进来一起学习交流哦 垃圾确定 在垃圾回收之前,jvm需要确定哪些对象已死,即需要当做垃圾被回收。垃圾确认的方法传统的有引用计数法:用一个引用计数器来标记对象当前的引用次数,当引用计数为0时,对象可回收。这种方法有个弊端是无法解决循环引用的问题,如两个对象相互引用则它们永远不会释放。另外一种方法是可达性分析算法,目前主流的语言(java、c#、golang等)都是采用这种方法来判定一个对象是否存活。可达性分析算法的思路是:将一系列根对象作为起点

支持零Ether归集ERC20的智能钱包JS开发包

两盒软妹~` 提交于 2020-11-10 21:19:00
SmartWallet.JS 开发包适用于平台方使用JavaScript高效完成对用户地址上的Ether/ERC20代币的归集工作,无需向用户地址注入Ether即可完成Ether/ERC20代币的归集。官方下载地址: SmartWallet.JS 1、开发包概述 SmartWallet.JS开发包的主要特点如下: 真正的平台型非托管钱包,平台无需管理大量用户地址的密钥并且没有安全性的损失 无需向用户地址注入Ether即可完成以太币/ERC20代币的归集,流程更简单,效率更高 支持在单一交易内完成多个用户地址的归集 SmartWallet.JS开发包的主要代码文件清单见官网说明: http://sc.hubwiz.com/codebag/smartwallet-js/ 2、使用示例代码 2.1 部署工厂合约 SmartWallet.JS开发包利用工厂合约 SmartWalletFacotry 管理用户地址的生成与归集。因此首先需要部署工厂合约。 进入项目目录,执行如下命令在本地测试节点部署工厂合约和用于演示的 HappyToken 合约: ~$ cd smartwallet ~/smartwallet$ npm run deploy-dev 运行结果如下: 类似的,使用如下命令在主网部署工厂合约: ~/smartwallet$ npm run deploy-mainnet 注意

TRON智能钱包PHP开发包【零TRX归集】

。_饼干妹妹 提交于 2020-11-06 15:01:31
TronSmartWallet 开发包适用于平台方高效完成对用户或订单地址上的Trx/TRC20代币的归集工作,无需向用户或订单地址注入Trx即可完成Trx/TRC20代币的归集。官方下载地址: TronSmartWallet PHP开发包 。 1、开发包概述 TronSmartWallet开发包的主要特点如下: 真正的平台型非托管钱包,平台无需管理大量用户地址的密钥并且没有安全性的损失 无需向用户地址注入Trx即可完成Trx/TRC20代币的归集,流程更简单,效率更高 支持在单一交易内完成多个用户地址的归集 TronSmartWallet运行于PHP 7.1+环境下,主要类以及其关系如下图所示: TronSmartWallet的主要代码文件清单见官网说明: http://sc.hubwiz.com/codebag/tron-smartwallet/ 。 2、使用示例代码 2.1 部署工厂合约 TronSmartWallet开发包利用工厂合约SmartWalletFacotry管理用户地址的生成与归集。因此首先需要部署工厂合约。 示例代码 demo/deploy-contracts.php 展示了如何部署SmartWalletFactory合约以及一个用于演示的TRC20代币合约。执行如下命令运行示例代码: php deploy-contracts.php 运行结果如下: