JVM中的类加载&&Minor GC与Full GC

目录

[什么是类加载器? 常见的类加载器?](#什么是类加载器? 常见的类加载器?)

双亲委派模型

为什么要打破双亲委派模型

[Minor Gc 和 Full GC 有什么不同呢?Minor GC与Full GC分别在什么时候发生?](#Minor Gc 和 Full GC 有什么不同呢?Minor GC与Full GC分别在什么时候发生?)


什么是类加载器 ? 常见的类加载器?

Bootstrap ClassLoader :启动 类加载器

最顶层的加载类,由C++实现,负责加载JAVA_HOME/jre/lib目录下的jar包和类,(如String、System等)

Extension ClassLoader :扩展 类加载器

它负责加载JRE的扩展目录(JAVA_HOME/jre/lib/ext 下的类)中JAR包的类

Application ClassLoader :系统 类加载器

面向我们用户的加载器,负责加载当前应用classpath下的所有jar包和类

双亲委派模型

双亲委派模式:

  • 在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。

  • 加载器加载类时先把请求委托给自己的父类加载器执行, 直到顶层的启动类加载器. 父类加载器能够完成加载则成功返回, 不能则子类加载器才自己尝试加载.

  • 简而言之: 自底向上检查类是否被加载, 自顶向下尝试加载类

优点:

  • 避免类的重复加载

  • 避免Java的核心API被篡改, 保证安全

为什么要打破双亲委派模型

但是使用双亲委派也存在一定的局限性,在正常情况下,用户代码是依赖核心类库的,所以按照正常的双亲委派加载流程是没问题的;

但是在加载核心类库时,如果需要使用用户代码,双亲委派流程就无法满足;

比如在使用JDBC时, 利用DriverManager.getConnection获取连接

时,就会存在这样的问题。

  • DriverManager是由Bootstrap ClassLoader加载的,在加载DriverManager时,会执行其静态方法,加载初始驱动程序;

  • 但是这些实现类基本都是第三方厂商提供的,根据双亲委派原则,第三方的类不可能被Bootstrap ClassLoader加载。

  • 所以这时候就需要打破双亲委派模型来进行加载.

Minor Gc 和 Full GC 有什么不同呢?Minor GC与Full GC分别在什么时候发生?

  • Minor GC是发生在新生代的垃圾收集动作,所以Minor GC非常频繁,一般回收速度也比较快。

  • Full GC 指的是针对新生代、老年代、永久代的全体内存空间的垃圾回收. Full GC回收速度更慢, 发生频率也更低.

什么时候触发Minor GC

  • Eden区域满了

  • 新创建的对象大小 > Eden所剩空间

什么时候会触发full GC

  • System.gc()方法的调用

  • 老年代空间不足

  • 永久代空间不足

  • 统计得到的Minor GC晋升到老年代的平均大小大于老年代的剩余空间

  • 堆中分配很大的对象

所谓大对象,是指需要大量连续内存空间的java对象,例如很长的数组,此种对象会直接进入老年代,而老年代虽然有很大的剩余空间,但是无法找到足够大的连续空间来分配给当前对象,此种情况就会触发JVM进行Full GC。

相关推荐
人道领域3 小时前
【零基础学java】(等待唤醒机制,线程池补充)
java·开发语言·jvm
小突突突3 小时前
浅谈JVM
jvm
饺子大魔王的男人5 小时前
远程调试总碰壁?局域网成 “绊脚石”?Remote JVM Debug与cpolar的合作让效率飙升
网络·jvm
天“码”行空15 小时前
java面向对象的三大特性之一多态
java·开发语言·jvm
独自破碎E20 小时前
JVM的内存区域是怎么划分的?
jvm
期待のcode21 小时前
认识Java虚拟机
java·开发语言·jvm
leaves falling1 天前
一篇文章深入理解指针
jvm
linweidong1 天前
C++ 中避免悬挂引用的企业策略有哪些?
java·jvm·c++
曹轲恒1 天前
JVM中的直接内存
jvm