做网站的图片=gif,服装网站建设费用,营销网站型建设多少钱,长沙如何做百度的网站推广文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程#xff08;类的生命周期#xff09;3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full… 文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程类的生命周期3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full GC的区别是什么 6、JVM有哪些垃圾回收器6.1 G1垃圾回收器 7、强软弱虚引用的区别 1、类加载器
1.1 什么是类加载器
JVM处理class字节码文件成为二进制文件类加载的作用则是将class字节码文件加载到JVM中。有四种类加载器
启动类加载器加载JDK下的jre/lib下的类这个加载器由C实现扩展类加载器加载JDK下的jre/lib/ext下的类如果把开发者自己写的class放这个目录也会被扩展类加载器加载应用类加载器加载开发者自己写的class自定义类加载器自己去继承ClassLoader自己实现
1.2 什么是双亲委派机制
加载某一个类时先委托上一级的加载器父加载器去进行加载如果上一级加载器也有上级则继续向上委托若没被上级加载则向下开始逐个找直到加载成功到最下面的加载器也没找到这个类则抛异常ClassNotFountException。总之
自底向上查找是否已经被父加载器加载过有则直接返回若没被加载再自顶向下进行加载 该机制的作用
保证类加载的安全性避免用户自定义一个java.lang.String恶意替换JDK的核心类库里的String类避免重复加载避免同一个类被多次加载提高效率 2、类装载的执行过程类的生命周期
加载查找和导入class 文件验证保证加载类的准确性准备为类变量分配内存并设置类变量初始值解析把类中的符号引用转换为直接引用初始化对类的静态变量静态代码块执行初始化操作使用new对象卸载删掉方法区的InstanceKlass和堆的Class对象 加载加载磁盘上的class字节码文件、动态代理生成的类通过全类名获取类的二进制数据流解析类的二进制数据流在方法区中生成一个InstanceKlass对象c保存了类的所有信息堆区生成一个和上面InstanceKlass对象类似的java.lang.Class对象给Java代码操作 连接--验证验证文件格式魔数、class文件里的主版本号是否适配当前JVM、符号引用里是否有其他类的private变量 连接--准备为静态变量分配内存并设置初始值
static变量分配空间在准备阶段完成(设置默认值)赋值在初始化阶段完成如下面的b变量static final 修饰基本类型以及字符串常量值已确定赋值在准备阶段完成如下面的c、d变量static final 修饰引用类型赋值也在初始化阶段完成如下面的obj变量 连接--解析将符号引用转为直接引用比如方法中调用了其他方法直接引用即使用内存地址直接指向方法。如#25转为内存地址。
初始化初始化阶段对类的静态变量初始化、静态代码块执行。
如果初始化一个类的时候其父类尚未初始化则优先初始化其父类如果同时包含多个静态变量和静态代码块则按照自上而下的顺序依次执行
使用new关键字创建对象调用静态类成员信息比如静态字段、静态方法
【类的生命周期】
3、对象什么时候可以被垃圾回收器处理
如果一个对象没有任何引用指向它了那这个对象就被定义为垃圾可能被垃圾回收器回收。确定是否有引用指向它有两种方式
引用计数法维护个计数被引用一次就1循环依赖时会有内存泄漏一般不用可达性分析普通对象A经一个引用链可以到达GC Root对象则A不可被回收JVM持有GCRoot的List列表 A、B、C、D不可回收X、Y可回收
4、JVM垃圾回收算法
标记清除算法、复制算法、标记整理算法、分代算法
4.1 标记清除算法
先根据可达性分析算法标记垃圾对象再对标记了可回收的对象进行GC 优点是标记和清除速度较快缺点是回收后出现内存碎片化不连贯存个大对象或者数组内存地址连续就不行
4.2 标记整理算法 和标记清除算法相比多了一步对象内存位置移动的步骤解决了碎片化但效率也低了一点
4.3 复制算法
内存一分为二Form和To两块先在From存对象进行回收时将存活的对象copy到To空间再清掉From剩下的可回收对象然后From和To角色互换To成了新的From清理后的From成了To 优点是无碎片化问题效率较高但空间利用率低一半一半的存
5、分代收集算法
【GC算法详细】 JDK8时堆被分成两份默认新生代 老年代 12 对占堆三分之一的新生代又分为三块
伊甸园区Eden新生的对象都分配到这里两块幸存者区survivor分成from和toEden区from区to区 811
分代回收的步骤
新创建的对象都会先分配到 eden 区当伊甸园内存不足标记伊甸园与 from(现阶段没有对象)的存活对象将存活对象采用复制算法复制到 to 中复制完毕后伊甸园和from 内存都得到释放 经过一段时间后伊甸园的内存又出现不足标记 eden 区域 to 区存活的对象将存活的对象复制到 from 区 继续伊甸园区 S0 S1之间玩复制算法直到有对象经过了15次GCGC年龄默认15晋升到老年代不再from和to之间频繁的复制 对象过大或者幸存者区空间不足可能出现对象提前晋升到老年代
5.1 MinorGC、Mixed GC、Full GC的区别是什么
STWstop the world暂停所有用户线程等待垃圾回收完成再处理用户请求STW要尽量短
MinorGCYoung GC发生在新生代的垃圾回收暂停时间短(STW)这也是分代的最明显的一个好处了Mixed GC 新生代 老年代部分区域的垃圾回收G1 收集器特有Full GC新生代 老年代完整垃圾回收暂停时间长(STW)应尽力避免
6、JVM有哪些垃圾回收器
串行垃圾收集器Serial GC、Serial Old 只有一个线程处理垃圾回收期间用户线程阻塞STW GC并行垃圾收集器Parallel Old GC、ParNewGC多个线程处理垃圾回收期间用户线程阻塞STW CMS并发垃圾收集器CMS GC作用在老年代 G1垃圾收集器作用在新生代和老年代
6.1 G1垃圾回收器 应用于新生代和老年代在JDK9之后默认使用G1 堆被划分成多个区域Region每个区域都可以充当edensurvivoroldhumongous其中 humongous 专为大对象准备 采用复制算法 响应时间与吞吐量兼顾 分成三个阶段新生代回收、并发标记、混合回收MixedGC。多次Young GC回收后当堆的使用率达到阈值触发混合回收MixedGC用复制算法回收一轮所有年轻代、部分老年代、大对象区 因为清理是复制算法如果清理时发现没有空Region去存放转移的对象没地儿复制了则转为单线程执行标记-整理算法进行Full GC此时会导致用户线程的暂停
【GC回收器】
7、强软弱虚引用的区别
强引用默认只要有 GCRoots能找到它就不会被回收哪怕OOM软引用需要配合 SoftReference 使用当垃圾多次回收内存依然不够的时候会回收软引用对象 弱引用需要配合 WeakReference 使用只要进行了垃圾回收就会把弱引用对象回收 虚引用和其他几种引用不一样它不影响对象的回收规则形同虚设。必须配合引用队列使用被引用对象回收时会将虚引用入队由 Reference Handler 线程调用虚引用相关方法。虚引用的一个应用场景是直接内存的释放问题。
【详细】
强引用 软引用 弱引用 虚引用