微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM相关

JVM入门

jvm的位置

位于操作系统之上

jvm的体系结构

image-20210319083131595

类加载器

应用类加载器:AppClassLoader

扩展加载器:ExtClassLoader (jre/lib/ext/)

根加载器:null,java程序获取不到,(rt.jar)

Native关键字

表示调用底层的C函数

双亲委派机制

先从根加载器里找,找不到去扩展类加载器,然后再去应用类加载器

面试问题

  • 为什么需要双亲委派机制?(也就是双亲委派的优点)

    ①双亲委派机制使得类加载出现层级,父类加载器加载过的类,子类加载器不会重复加载,可以防止类重复加载

    ②使得类的加载出现优先级,防止了核心API被篡改,提升了安全,所以越基础的类就会越上层进行加载,反而一般自己的写的类,就会在应用程序加载器(Application)直接加载。

  • 如何打破双亲委派?

    自定义类加载器,重写loadClass方法

    ②使用线程上下文类加载器

堆分区

  • 新生区:类诞生和成长的地方,刚new的对象都在这

    轻GC也没有干掉的对象会进入幸存区

    • 伊甸园区
    • 幸存区from
    • 幸存区to
  • 养老区:从幸存区触发FULL GC还活着的会来到养老区

  • 永久区(元空间):常驻内存,存放JDK自带的Class对象,这个区不存在垃圾回收。

image-20210319110155704

出现OOM,OutOfMemory

轻GC和重GC发生的时间。

  • 轻GC:发生在伊甸园区满了的时候

  • 重GC:发生在伊甸园区和幸存区都满了的时候

  • 如果伊甸园区、幸存区、养老区都满了,就该OOM了,堆溢出

VM options参数

  • -xms 设置初始化内存分配大小,认1/64

  • -Xmx 设置最大分配内存,认1/4

  • -XX:+PrintGCDetails 打印GC垃圾回收信息

  • -XX:+HeapDumpOnOutOfMemoryError 生成oomDump文件

    • -xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

    • -xms1024m -Xmx1024m -XX:+PrintGCDetails

GC之复制算法:把from区的对象复制到to区

  • 好处:没有内存碎片
  • 坏处:浪费了内存空间,from和to区总有一个是空的
  • 最佳使用场景:对象存活度较低的时候。也就是新生区

image-20210319143353062

GC之标记清除算法

  • 优点:不需要额外空间
  • 缺点:两次扫描,严重浪费时间,会产生内存碎片

image-20210319144326176

GC之标记压缩算法

  • 在清除算法的基础上多了一次移动成本

image-20210319144529136

总结:

年轻代:存活率低

  • 复制算法

老年代:区域大,存活率高

  • 标记清除(内存碎片不是太多) + 标记压缩混合实现

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐