面试准备-JVM篇

jvm怎么调优的?

jvm结构?堆里面几个区?

jvm 内存划分 栈区 堆区 方法区

jvm 内存划分 栈区 堆区 方法区

java自带有哪几种线程池

java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

GC(garbage collect)垃圾回收机制

核心问题:
GC 操作的是JVM里面的哪一部分内存区?
JVM内存结构图
如何判断垃圾对象?
引用计数法 (在java中是通过引用来和对象进行关联的)(无法解决循环引用)
Java中采取了 可达性分析法(图论里面的可达性分析)

典型的垃圾收集算法?

  1. Mark-Sweep(标记-清除)算法(容易产生内存碎片)
  2. Copying(复制)算法(对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半)
  3. Mark-Compact(标记-整理)算法(先标记,但不直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存)
  4. Generational Collection(分代收集)算法
    老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

永久代(Permanet Generation) 永久代的回收主要回收两部分内容:废弃常量和无用的类

老年代的特点是每次回收都只回收少量对象,一般使用的是Mark-Compact算法。

目前大部分垃圾收集器对于新生代都采取Copying算法,复制次数少但并不是按照1:1的比例来划分空间的

典型的垃圾收集器?

方法区和堆由所有线程共享,其他区域都是线程私有的

虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)。Java堆只要求逻辑上是连续的,在物理空间上可以不连续。

直接内存 –堆外内存

JDK1.5中引用了NIO,并引用了Channel与Buffer,可以使用Native函数库直接分配堆外内存,并通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。

堆外内存 由操作系统管理,而不是JVM管理

如何判断垃圾对象?
引用计数法