吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1715|回复: 6
收起左侧

[Java 转载] 自己整理总结的JVM《浅尝JVM》(2)

[复制链接]
徐行且慢 发表于 2020-10-13 16:59
新生代
新生代是用来存放新生的对象,一般占据堆得1/3空间。由于频繁创建对象,所以新生代会频繁触发MinorGC进行垃圾回收。
MinorGC:新生代GC
Eden(伊甸园区)区
java新对象的出生地(如果创建的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够的时候就会触发MinorGC,对新生区进行一次垃圾回收。
SurvivorFrom(幸存者区)
上一次GC的幸存者,作为这一次GC的被扫描者。
Survivor(幸存者2号)
保留了一次MinorGC过程中的幸存者。
新生代讲解:
首先,新生代伊甸园区创建对象,判断伊甸园区空间是否足够,如果内存不够会产生一次轻gc(MinorGC),如果轻gc后内存还不够,回向老年代借空间也就是会触发JVM担保机制,担保机制是(当在新生代无法分配内存的时候,把新生代的对象转移到老年代,然后把新对象放入腾空的新生代),这就是伊甸园区内存不够,会产生的情况。
什么是担保机制
轻GC的讲解:
    轻gc是将新生代进行一个清除,然后将全部的存活对象放入到to,在轻gc结束时,to区和fron区会进行一个转换,也就是谁空谁是to区;且会将当前存活对象年龄做+1;如果to区空间不足会直接将对象放入到老年代中,不去考虑年龄问题。
    什么是转换:(复制算法)
        转换就是将from区变成to区,将to区变成from区;
(复制算法 copying):为了解决Mark-Sweep算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小 的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。

新生代对象什么时候进入老年代:
    新生代初始对象年龄默认是1,默认执行15次后会进入老年代,也就是年龄到达16,就进入了老年代。
老年代
主要存放应用程序中生命周期长的内存对象。
    老年代的对象比较稳定,所以 MajorGC 不会频繁执行。在进行 MajorGC 前一般都先进行 了一次 MinorGC,使得有新生代的对象晋身入老年代,导致空间不够用时才触发。当无法找到足 够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收腾出空间。
    MajorGC 采用标记清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没 有标记的对象。MajorGC的耗时比较长,因为要扫描再回收。MajorGC 会产生内存碎片,为了减 少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。当老年代也满了装不下的 时候,就会抛出OOM(Out of Memory)异常。

老年代讲解:
    首先我们要了解老年代是做什么的,它的主要作用就是存放应用程序中生命周期长的内存对象;且老年代的对象比较稳定,所以重GC(MajorGC )不会频繁的发生,所以在重GC(MajorGC )产生前都会发生一次轻GC(MinorGC),这样的目的是为了让新生代对象能够进入到老年代。
重gc采用的是
(标记清除算法 Mark-Sweep):是先扫描一次然后将幸存者标记出来,然后处理没有标记的对象;重gc耗时较长,因为是先扫描在清理。是会产生内存碎片,为了减少内存损耗,我们一般需要进行合并或者标记出来方便下次直接分配。
当老年代也满了装不下的 时候,就会抛出OOM(Out of Memory)异常。
(复制算法 copying):为了解决Mark-Sweep算法内存碎片化的缺陷而被提出的算法。按内存容量将内存划分为等大小 的两块。每次只使用其中一块,当这一块内存满后将尚存活的对象复制到另一块上去,把已使用的内存清掉。
缺点:大的问题是内存碎片化严重,后续可能发生大对象不能找到可 利用空间的问题。
合并和标记:
        合并是为了让所有存活对象整理到一块区域,重新标记一次,为了下一次进入到老年代的新幸存者,能够成功的存入。

缺点:这种算法虽然实现简单,内存效率高,不易产生碎片,但是大的问题是可用内存被压缩到了原 本的一半。且存活对象增多的话,Copying算法的效率会大大降低。
(标记整理算法):结合了以上两个算法,为了避免缺陷而提出。标记阶段和Mark-Sweep算法相同,标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。
永久代
指内存的永久保存区域,主要存放 Class 和 Meta(元数据)的信息,Class 在被加载的时候被 放入永久区域,它和和存放实例的区域不同,GC 不会在主程序运行期对永久区域进行清理。所以这 也导致了永久代的区域会随着加载的Class的增多而胀满,终抛出OOM(内存溢出)异常。
元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的。

   
Java8和元数据
在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。
元空间 的本质和永久代类似,元空间与永久代之间大的区别在于:元空间并不在虚拟机中,而是使用 本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由 MaxPermSize控制, 而由系统的实际可用空间来控制。

JVM管理的内存可以总体划分为两部分:Heap Memory和Native Memory(了解)
Heap Memory:是供Java应用程序使用的,Heap Memory及其内部各组成的大小可以通过JVM的一系列命令行参数来控制(了解)
Native Memory:也称为C-Heap,是供JVM自身进程使用的。没有相应的参数来控制大小,其大小依赖于操作系统进程的最大值(对于32位系统就是3~4G,各种系统的实现并不一样),以及生成的Java字节码大小、创建的线程数量、维持java对象的状态信息大小(用于GC)以及一些第三方的包,比如JDBC驱动使用的native内存。(了解)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jzn198888 发表于 2020-10-13 17:04
多谢分享
lvbuqing 发表于 2020-10-13 17:50
yxk67888 发表于 2020-10-13 18:10
 楼主| 徐行且慢 发表于 2020-10-13 18:32
lvbuqing 发表于 2020-10-13 17:50
搞个图啊,自己理解的内存模型图

全弄了,把云笔记链接给你们
q1q23333 发表于 2020-10-13 20:28
谢谢DSSDDS
testicles 发表于 2020-11-11 15:39
分享下笔记,谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-29 04:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表