开篇介绍

大家好,我是Java最全面试题库提裤姐,今天这篇是分布式技术的第十篇,主要总结了JVM性能调优相关的问题;在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。



Q:

深拷贝和浅拷贝

  • 浅拷贝(shallowCopy):增加了一个指针指向已存在的内存地址。

  • 深拷贝(deepCopy):增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。

  • 浅复制:指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

  • 深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。


Q:

常量池是什么

可以理解为class文件之中的资源仓库,它是class文件结构中与其他项目关联最多的数据类型,也是占用class文件空间最大的数据项目之一,同时它还是class文件中第一个出现表类型的数据项目.

由于常量池的数量是不固定的,所以在常量池入口需要放置一项u2(即2个字节)类型的数据,代表常量池容量计数值(constant-pool-count)(从1开始,将0表示不引用任何常量).

常量池中主要存放两大类常量:

  • 字面量(Literal):比较接近于Java语言层面的常量概念,如文本字符串,声明为final的常量值.

  • 符号引用(Synbolic Reference):包括如下三类常量:
    ①类和接口的全限定名(Fully Qualified Name)
    ②字段的名称和描述符(Descriptor)
    ③方法的名称和描述符



Q:

常量池在class文件的什么位置

【075期】分布式面试题(十):JVM性能调优_JAVAimage.png


Q:

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

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



Q:

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

垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的 finalize方法,但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说 finalize可能永远不被执行,显然指望它做收尾工作是靠不住的。它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种 JNI(Java Native Interface)调用non-java程序(C或C++), finalize()的工作就是回收这部分的内存。


Q:

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

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