国产在线无码一区二区三区外皮他人给你点评的标签、留住的烙迹
发布日期:2022-04-22 22:51    点击次数:111

 国产在线无码一区二区三区

本文转载自微信公众号「 bugstack虫洞栈」,作家小傅哥  。转载本文请推测 bugstack虫洞栈公众号。

目次

一、序论 二、口试题 三、先脱手考据垃圾回收 四、JVM 垃圾回收学问框架 1. 判断对象已死 2. 垃圾回收算法 3. 垃圾回收器 五、回首 六、系列保举

一、序论

培育自身价值有多进军?

经过了风风雨雨,看过了男男女女。时刻经过的岁月就莫得不朽不变的!

在这趟车上有人下、有人上,外皮他人给你点评的标签、留住的烙迹,都只是这趟车上的故事。唯有个人成长了、齐集了、沉淀了,才有契机当我方的司机。

可能某个年齿段的你还看不懂,但如果某天你不那么忙了,要思考思考我方的路、我方的脚步。望望这些是不是你想要的,如果都是你想要的,为什么你看起来不兴隆?

好!加油,走向你想成为的我方!

二、口试题

谢飞机,小记!,中午吃饱了运转发怔,若何就学不来这些学问呢,它也不进脑子!

「谢飞机」:喂,口试官老迈,我想问个问题。

「口试官」:什么?

「谢飞机」:即是这学问它不进脑子呀!

「口试官」:这....

「谢飞机」:即是看了忘,忘了看的!

「口试官」:是不是莫得现实?只是看了就以为会了,储藏了就示意懂了?哪哪都不潜入!?

「谢飞机」:好像是!那有什么成见?

「口试官」:也莫得太好的成见,学习本人即是一件败兴的事情。减少碎屑化的时刻亏损,多用在系统化的学习上会更好一些。哪怕你写写博客记载下,考据下亦然好的。

三、先脱手考据垃圾回收

说是垃圾回收,我不援用了它就回收了?什么时候回收的?咋回收的?

莫得看到骨子的例子,通常就很难让理科生经受这类学问。我我方也相同,最佳是让我看得见。代码是对数学逻辑的具体兑现,莫得兑现经过只看谜底是莫得真谛的。

「测试代码」

public class ReferenceCountingGC {      public Object instance = null;     private static final int _1MB = 1024 * 1024;     /**      * 这个成员属性的独一真谛即是占点内存, 以便能在GC日记中看明晰是否有回收过      */     private byte[] bigSize = new byte[2 * _1MB];      public static void main(String[] args) {         testGC();     }      public static void testGC() {         ReferenceCountingGC objA = new ReferenceCountingGC();         ReferenceCountingGC objB = new ReferenceCountingGC();         objA.instance = objB;         objB.instance = objA;         objA = null;         objB = null;         // 假定在这行发生GC, objA和objB是否能被回收?         System.gc();     }  } 

例子来自于《潜入意会Java虚构机》中援用计数算法章节。

例子要说明的放弃是,相互援用下却一经置为null的两个对象,是否会被GC回收。如果只是按照援用计数器算法来看,那么这两个对象的计数标记不会为0,也就不行被回收。但到底有莫得被回收呢?

这里咱们先经受 jvm 器具教唆,jstat来监控。因为监控的经过需要我手敲代码,比拟耗时,是以咱们在调用testGC()前,就寝会 Thread.sleep(55000);。启动代码后膨大如下教唆。

E:\itstack\git\github.com\interview>jps -l 10656 88464 38372 org.itstack.interview.ReferenceCountingGC 26552 sun.tools.jps.Jps 110056 org.jetbrains.jps.cmdline.Launcher  E:\itstack\git\github.com\interview>jstat -gc 38372 2000  S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0    0.0   65536.0   6561.4   175104.0     0.0     4480.0 770.9  384.0   75.9       0    0.000   0      0.000    0.000 10752.0 10752.0  0.0   1288.0 65536.0    0.0     175104.0     8.0     4864.0 3982.6 512.0  440.5       1    0.003   1      0.000    0.003 10752.0 10752.0  0.0    0.0   65536.0   437.3    175104.0    1125.5   4864.0 3982.6 512.0  440.5       1    0.003   1      0.012    0.015 10752.0 10752.0  0.0    0.0   65536.0   437.3    175104.0    1125.5   4864.0 3982.6 512.0  440.5     
S0C、S1C,第一个和第二个幸存区大小 S0U、S1U,第一个和第二个幸存区使用大小 EC、EU,伊甸园的大小和使用 OC、OU,老年代的大小和使用 MC、MU,门径区的大小和使用 CCSC、CCSU,压缩类空间大小和使用 YGC、YGCT,年青代垃圾回收次数和耗时 FGC、FGCT,老年代垃圾回收次数和耗时 GCT,垃圾回收总耗时

「瞩目」:知悉后头三行,S1U = 1288.0、GCT = 0.003,说明一经在膨大垃圾回收。

接下来,咱们再换种面目测试。在启动的程序中,加入GC打印参数,知悉GC变化放弃。

-XX:+PrintGCDetails  打印每次gc的回收情况 程序运行终局后打印堆空间内存信息(包含内存溢出的情况) -XX:+PrintHeapAtGC  打印每次gc前后的内存情况 -XX:+PrintGCTimeStamps 打印每次gc的绝交的时刻戳 full gc为每次对重生代老年代以及通盘空间做搭伙的回收 系统中应该尽量幸免 -XX:+TraceClassLoading  打印类加载情况 -XX:+PrintClassHistogram 打印每个类的实例的内存占用情况 -Xloggc:/Users/xiaofuge/Desktop/logs/log.log  合营上头的使用将上头的日记打印到指定文献 -XX:HeapDumpOnOutOfMemoryError 发生内存溢出将堆信息转存起来 以便分析 

这回就可以把就寝去掉了,并添加参数 -XX:+PrintGCDetails,如下:

「测试放弃」

[GC (System.gc()) [PSYoungGen: 9346K->936K(76288K)] 9346K->944K(251392K), 0.0008518 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]  [Full GC (System.gc()) [PSYoungGen: 936K->0K(76288K)] [ParOldGen: 8K->764K(175104K)] 944K->764K(251392K), [Metaspace: 3405K->3405K(1056768K)], 0.0040034 secs] [Times: user=0.08 sys=0.00, real=0.00 secs]  Heap  PSYoungGen      total 76288K, used 1966K [0x000000076b500000, 0x0000000770a00000, 0x00000007c0000000)   eden space 65536K, 3% used [0x000000076b500000,0x000000076b6eb9e0,0x000000076f500000)   from space 10752K, 0% used [0x000000076f500000,0x000000076f500000,0x000000076ff80000)   to   space 10752K, 0% used [0x000000076ff80000,0x000000076ff80000,0x0000000770a00000)  ParOldGen       total 175104K, used 764K [0x00000006c1e00000, 0x00000006cc900000, 0x000000076b500000)   object space 175104K, 0% used [0x00000006c1e00000,0x00000006c1ebf100,0x00000006cc900000)  Metaspace       used 3449K, capacity 4496K, committed 4864K, reserved 1056768K   class space    used 376K, capacity 388K, committed 512K,久黄久久 reserved 1048576K 
从运行放弃可以看出内存回收日记,Full GC 进行了回收。 也可以看出JVM并不是依赖援用计数器的面目,判断对象是否存活。不然他们就不会被回收啦

「有了这个例子,咱们再接着望望JVM垃圾回收的学问框架!」

四、JVM 垃圾回收学问框架

垃圾采集(Garbage Collection,简称GC),最早于1960年出生于麻省理工学院的Lisp是第一门运转使用内存动态分拨和垃圾采集技能的讲话。

垃圾采集器主要做的三件事:哪些内存需要回收、什么时候回收、若何回收。

而从垃圾采集器的出生到当前有半个世纪的发展,当前的内存动态分拨和内存回收技能一经极端训诫,一切看起来都参加了“自动化”。但在某些时候如故需要咱们去监测在高并发的场景下,是否有内存溢出、显露、GC时刻经过等问题。是以在了解和贯通垃圾采集的推测学问对于高等程序员的成长就极端进军。

垃圾采集器的中枢学问项主要包括:判断对象是否存活、垃圾采集算法、千般垃圾采集器以及垃圾回收经过。如下图;

图 27-1 垃圾采集器学问框架

原图下载结合:http://book.bugstack.cn/#s/6jJp2icA

1. 判断对象已死

1.1 援用计数器

为每一个对象添加一个援用计数器,统计指向该对象的援用次数。 当一个对象有相应的援用更新操作时,则对方针对象的援用计数器进行增减。 一朝当某个对象的援用计数器为0时,则示意此对象一经圆寂,可以被垃圾回收。

从兑现来看,援用计数器法(Reference Counting)诚然占用了一些特等的内存空间来进行计数,然而它的兑现有盘算浅易,判断着力高,是一个可以的算法。

也有一些比拟出名的援用案例,比如:微软COM(Component Object Model) 技能、使用ActionScript 3的FlashPlayer、 Python讲话等。

「然而」,在主流的Java虚构机中并莫得采取援用技能算法来治理内存,主如果因为这个浅易的计数面目在处理一些相互依赖、轮回援用等就会极端复杂。可能会存在不再使用但又不行回收的内存,变成内存显露

1.2 可达性分析法

Java、C#等主流讲话的内存治理子系统,都是通过可达性分析(Reachability Analysis)算法来判定对象是否存活的。

它的算法思绪是通过界说一系列称为 GC Roots 根对象手脚肇始节点集,从这些节点起程,穷举该联接援用到的全部对象填充到该联接中(live set)。这个经过教过符号,只符号那些存活的对象 好,那么当前未被符号的对象即是可以被回收的对象了。

GC Roots 包括;

全局性援用,对门径区的静态对象、常量对象的援用 膨大高下文,对 Java门径栈帧中的局部对象援用、对 JNI handles 对象援用 已启动且未罢手的 Java 线程

「两大问题」

误报:已圆寂对象被符号为存活,垃圾采集不到。多占用一会内存,影响较小。

漏报:援用的对象(正在使用的)莫得被符号为存活,被垃圾回收了。那么径直导致的即是JVM奔溃。(STW可以确保可达性分析法的准确性,幸免漏报)

2. 垃圾回收算法

2.1 符号-撤废算法(mark-sweep)

符号-撤废算法(mark-sweep)

符号无援用的圆寂对象所占据的舒服内存,并记载到舒服列表中(free list)。 当需要创建新对象时,内存治理模块会从 free list 中寻找舒服内存,分拨给新建的对象。 这种计帐面目其实极端浅易高效,然而也有一个问题内存碎屑化太严重了。 「Java 虚构机的堆中对象」,必须是连气儿散播的,是以顶点的情况下可能即使总剩余内存足够,但寻找连气儿内存分拨着力低,或者严重到无法分拨内存。重启汤姆猫! 在CMS中有此类算法的使用,GC暂停时刻短,但存在算法颓势。

2.2 符号-复制算法(mark-copy)

符号-复制算法(mark-copy)

从图上看这回做完垃圾计帐后连气儿的内存空间就大了。 这种面目是把内存区域分红两份,分裂用两个指针 from 和 to 留心,而况只使用 from 指针指向的内存区域分拨内存。 当发生垃圾回收时,则把存活对象复制到 to 指针指向的内存区域,并交换 from 与 to 指针。 它的平允很彰着,即是处罚内存碎屑化问题。但也带来了其他问题,堆空间亏损了一半。

2.3 符号-压缩算法(mark-compact)

符号-压缩算法(mark-compact)

1974年,Edward Lueders 忽视了符号-压缩算法,符号的经过和符号撤废算法相同,但在后续对象计帐程序中,先把存活对象都向内存空间一端出动,然后在计帐掉其他内存空间。 这种算法大要处罚内存碎屑化问题,但压缩算法的性能支拨也不小。

3. 垃圾回收器

3.1 重生代

1.Serial

算法:符号-复制算法

说明:浅易高效的单核机器,Client口头下默许重生代采集器;

2.Parallel ParNew

算法:符号-复制算法

说明:GC线程并行版块,在单CPU场景着力不特出。常用于Client口头下的JVM

3.Parallel Scavenge

算法:符号-复制算法

说明:方针在于达到可控隐晦量(隐晦量=用户代码运行时刻/(用户代码运行时刻+垃圾回收时刻));

3.2 老年代

1.Serial Old

算法:符号-压缩算法

说明:性能一般,单线程版块。1.5之前与Parallel Scavenge合营使用;手脚CMS的后备预案。

2.Parallel Old

算法:符号-压缩算法

说明:GC多线程并行,为了替代Serial Old与Parallel Scavenge合营使用。

3.CMS

算法:符号-撤废算法

1966年,罗伯特·丹纳德利用单晶体管将信息存储进电子电路中,信息存储自此来到了电子时代。在芯片技术的加持下,存储能力也越来越强。如今的存储芯片主要分为动态存储芯片和闪存芯片。其中动态存储器是指在指定功能或应用软件之间进行共享的存储器,主要是应用在计算机系统等智能设备的配备上;闪存芯片全称为快闪存储器,是一种可以存储任何数据格式的可移动存储产品,用于线下信息的交流。

2021年12月20号,浙江省杭州市税务局发布公告,薇娅在2019-2020年期间,通过隐匿个人收入、虚构业务转换收入性质、虚假申报等形式偷逃税6.43亿,其他少缴税0.6亿。根据国家相关法律规定,薇娅需要追缴税款、加收滞纳金以及缴纳罚款共计13.41亿元。

而今年,我们则期望不要被公司“炒鱿鱼”就好。

说明:对CPU资源敏锐、停顿时刻长。符号-撤废算法,会产生内存碎屑,可以通过参数开启碎屑的吞并整理。基本已被G1取代

3.3 G1

算法:符号-压缩算法

说明:适用于多核大内存机器、GC多线程并行膨大,低停顿、高回告成率。

五、回首

JVM 的对于自动内存治理的学问浩荡,包括本文还没提到的 HotSpot 兑现算法细节的推测学问,包括:安全节点、安全区域、卡表、写障蔽等。每一项内容都值得潜入学习。

如果不单是是为了口试背题,最佳的面目是现实考据学习。不然这类学问就像3分以下的过电影相同,很难记取它的内容。

通盘的内容亦然小傅哥学习整理的一个经过,后续还会不断的延续深挖和共享。感敬爱的小伙伴可以通盘盘考学习。

 



 
 


Powered by 尹人香蕉久久综合网777 @2013-2022 RSS地图 HTML地图