jvm|「2022最新JVM面试题」10道不得不会的JVM面试题( 二 )


3. 说一下堆栈的区别?物理地址堆的物理地址分配对象是不连续的 。 因此性能慢些 。 在GC的时候也要考虑到不连续的分配 , 所以有各种算法 。 比如 , 标记-消除 , 复制 , 标记-压缩 , 分代(即新生代使用复制算法 , 老年代使用标记——压缩)
栈使用的是数据结构中的栈 , 先进后出的原则 , 物理地址分配是连续的 。 所以性能快 。
内存分别堆因为是不连续的 , 所以分配的内存是在运行期确认的 , 因此大小不固定 。 一般堆大小远远大于栈 。
栈是连续的 , 所以分配的内存大小要在编译期就确认 , 大小是固定的 。
存放的内容堆存放的是对象的实例和数组 。 因此该区更关注的是数据的存储
栈存放:局部变量 , 操作数栈 , 返回结果 。 该区更关注的是程序方法的执行 。
PS:静态变量放在方法区 静态的对象还是放在堆 。 程序的可见度
堆对于整个应用程序都是共享、可见的 。
栈只对于线程是可见的 。 所以也是线程私有 。 他的生命周期和线程相同 。
4. Java内存泄漏内存泄漏是指不再被使用的对象或者变量一直被占据在内存中 。
严格来说 , 只有对象不会再被程序用到了 , 但是GC又不能回收他们的情况 , 才叫内存泄漏 。
理论上来说 , Java是有GC垃圾回收机制的 , 也就是说 , 不再被使用的对象 , 会被GC自动回收掉 , 自动从内存中清除 。
但是 , 即使这样 , Java也还是存在着内存泄漏的情况 , java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露 , 尽管短生命周期对象已经不再需要 , 但是因为长生命周期对象持有它的引用而导致不能被回收 , 这就是java中内存泄露的发生场景 。
5. JVM 有哪些垃圾回收算法?

  • 标记-清除算法:标记有用对象 , 然后进行清除回收 。 缺点:效率不高 , 无法清除垃圾碎片 。
  • 复制算法:按照容量划分二个大小相等的内存区域 , 当一块用完的时候将活着的对象复制到另一块上 , 然后再把已使用的内存空间一次清理掉 。 缺点:内存使用率不高 , 只有原来的一半 , 消耗内存 。
  • 标记-整理算法:标记无用对象 , 让所有存活的对象都向一端移动 , 然后直接清除掉端边界以外的内存 。
  • 分代算法:根据对象存活周期的不同将内存划分为几块 , 一般是新生代和老年代 , 新生代基本采用复制算法 , 老年代采用标记整理算法 。
6. 说一下 JVM 有哪些垃圾回收器?

7. 说一下类加载的执行过程?
  • 加载:根据查找路径找到相应的 class 文件然后装载入内存中;

在这里插入图片描述
  • 验证:检查加载的 class 文件的正确性;
  • 准备:给类中的静态变量分配内存空间;
  • 解析:虚拟机将常量池中的符号引用替换成直接引用的过程 。 符号引用就理解为一个标示 , 而在直接引用直接指向内存中的地址;
  • 初始化:对静态变量和静态代码块执行初始化工作 。
8. 什么是双亲委派模型?为什么要使用双亲委派模型?什么是双亲委派模型