JVM 性能优化

作者: Hifun丶 | 来源:发表于2019-04-26 19:45 被阅读2次

    1、GC 是什么? 为什么要有 GC?

    GC 是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。

     2、简述 Java 垃圾回收机制。

    在 Java 中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在 JVM 中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,扫面那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。

     3、垃圾回收的优点和原理。并考虑 2 种回收机制。

    垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

    回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

     4、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

    对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。通常,GC 采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是”可达的”,哪些对象是”不可达的”。当 GC 确定一些对象为“不可达”时,GC 就有责任回收这些内存空间。

    垃圾回收器可以马上回收内存。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。

     5、深拷贝和浅拷贝。

    简单来讲就是复制、克隆。

    Person p=new Person(“张三”);

    浅拷贝就是对对象中的数据成员进行简单赋值,如果存在动态成员或者指针就会报错。

    深拷贝就是对对象中存在的动态成员或指针重新开辟内存空间。

     6、System.gc() 和 Runtime.gc() 会做什么事情?

    这两个方法用来提示 JVM 要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于 JVM 的。

     7、finalize() 方法什么时候被调用?析构函数 (finalization) 的目的是什么?

    垃圾回收器(garbage colector)决定回收某对象时,就会运行该对象的 finalize() 方法 但是在 Java 中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说 filalize() 可能永远不被执行,显然指望它做收尾工作是靠不住的。 

    那么 finalize() 究竟是做什么的呢? 它最主要的用途是回收特殊渠道申请的内存。Java 程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种 JNI(Java Native Interface)调用 non-Java 程序(C 或 C++), finalize() 的工作就是回收这部分的内存。

     8、如果对象的引用被置为 null,垃圾收集器是否会立即释放对象占用的内存?

    不会,在下一个垃圾回收周期中,这个对象将是可被回收的。

     9、什么是分布式垃圾回收(DGC)?它是如何工作的?

    DGC 叫做分布式垃圾回收。RMI 使用 DGC 来做自动垃圾回收。因为 RMI 包含了跨虚拟机的远程对象的引用,垃圾回收是很困难的。DGC 使用引用计数算法来给远程对象提供自动内存管理。

    10、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?

    吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。 而串行收集器对大多数的小应用(在现代处理器上需要大概 100M 左右的内存)就足够了。

    11、在 Java 中,对象什么时候可以被垃圾回收?

    当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。

    12、简述Java内存分配与回收策率以及 Minor GC 和 Major GC。

    · 对象优先在堆的 Eden 区分配

    · 大对象直接进入老年代

    · 长期存活的对象将直接进入老年代

    当 Eden 区没有足够的空间进行分配时,虚拟机会执行一次 Minor GC。Minor GC 通常发生在新生代的 Eden 区,在这个区的对象生存期短,往往发生 Gc 的频率较高,回收速度比较快;Full GC/Major GC 发生在老年代,一般情况下,触发老年代 GC 的时候不会触发 Minor GC,但是通过配置,可以在 Full GC 之前进行一次 Minor GC 这样可以加快老年代的回收速度。

    13、JVM 的永久代中会发生垃圾回收么?

    垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。

    注:Java 8 中已经移除了永久代,新加了一个叫做元数据区的 native 内存区。

    14、什么是类加载器,类加载器有哪些?

    实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。

    主要有一下四种类加载器:

    ·启动类加载器(Bootstrap ClassLoader)

    用来加载 Java 核心类库,无法被 Java 程序直接引用。

    ·扩展类加载器(extensions class loader)

    用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。

    ·系统类加载器(system class loader)

    它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader() 来获取它。

    ·用户自定义类加载器

    通过继承 java.lang.ClassLoader 类的方式实现。

    15、类加载器双亲委派模型机制?

    当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

    相关文章

      网友评论

        本文标题:JVM 性能优化

        本文链接:https://www.haomeiwen.com/subject/utzqnqtx.html