1. Java 虚拟机的内存布局(运行时数据区)
2. GC 算法及几种垃圾收集器
对象生存判断算法有两种:引用计数法 和 可达性分析算法
垃圾收集算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法
垃圾收集器:
收集器
算法
Serial
复制算法(单线程)
ParNew
复制算法(多线程)
Parallel Scavenge
复制算法(多线程)吞吐量高
Serial Old
标记-整理算法(单线程)
Parallnel Old
标记-整理(多线程)
CMS
标记-清除(并发) 最短回收停顿时间
G1
标记-整理
3.如何理解双亲委派模型及为什么要使用这种机制
从 Java 虚拟机的角度来说,有两种不同的类加载器:启动类加载器和其它类加载器。
它的好处可以用一句话总结,即防止内存中出现多份同样的字节码。
4.Java 内存模型及 happens-before 规则/volatile 关键字
JVM 定义了一组规则,通过这组规则来决定一个线程对共享变量的写入何时对另一个线程可见,这组
规则也称为 Java 内存模型(即 JMM),JMM 是围绕着程序执行的原子性、有序性、可见性展开的,
下面我们看看这三个特性。
happens-before 原则是用来来辅助保证程序执行的原子性、可见性以及有序性的问题。
volatile 是 Java 虚拟机提供的轻量级的同步机制,保证被 volatile 修饰的共享变量对所有线程总数
可见的,禁止指令重排序优化。
5、描述一下 JVM 加载 class 文件的原理机制?
答:JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的 Java
运行时系统组件。它负责在运行时查找和装入类文件的类。
6、GC 是什么? 为什么要有 GC?
答:GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记
或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的 GC 功能可以自动监测对象是
否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。
Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的
方法之一:System.gc() 或 Runtime.getRuntime().gc() 。
7、垃圾回收的优点和原理。并考虑 2 种回收机制。
答:Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼的内存管理的问题
迎刃而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,
Java 中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存
泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知
的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用
垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增
量垃圾回收。
8、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃
圾回收?
答:对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。通
常,GC 采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的
",哪些对象是"不可达的"。当 GC 确定一些对象为"不可达"时,GC 就有责任回收这些内存空间。可
以。程序员可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执
行。
9、jvm 的内存结构
java 虚拟机的内存结构分为堆(heap)和栈(stack),堆里面存放是对象实例也就是 new 出来的对象。
栈里面存放的是基本数据类型以及引用数据类型的地址。
对于所谓的常量是存储在方法区的常量池里面。
10、内存泄和内存溢出
内存泄露 (memory le)ak),是指应用程序在申请内存后,无法释放已经申请的内存空间.一次内存泄
露危害可以忽略,但如果任其发展最终会导致内存溢出(out of memory).
如读取文件后流要进行及时的关闭以及对数据库连接的释放。
内存溢出(out of memory 是指应用程序在申请内存时,没足够的内存空间供其使用。
如我们在项目中对于大批量数据的导入,采用分段批量提交的方式。
11.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?
Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执
行的字节码文件。
Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重
新编译。
Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。
12.强引用,软引用和弱引用的区别
强引用:
只有这个引用被释放之后,对象才会被释放掉,只要引用存在,垃圾回收器永远不会回收,
这是最常见的 New 出来的对象。
软引用:
内存溢出之前通过代码回收的引用。软引用主要用户实现类似缓存的功能,在内存足够的情
况下直接通过软引用取值,无需从繁忙的真实来源查询数据,提升速度;当内存不足时,自
动删除这部分缓存数据,从真正的来源查询这些数据。
弱引用:
第二次垃圾回收时回收的引用,短时间内通过弱引用取对应的数据,可以取到,当执行过第
二次垃圾回收时,将返回 null。弱引用主要用于监控对象是否已经被垃圾回收器标记为即将
回收的垃圾,可以通过弱引用的 isEnQueued 方法返回对象是否被垃圾回收器标记。
虚引用:
对生存时间无影响,在垃圾回收时得到通知。
13.垃圾回收是在什么时候开始?对什么东西,做了什么事情?
GC 何时开始:
所有的回收器类型都是基于分代技术来实现的,那就必须要清楚对象按其生命周期是如何划
分的。
年轻代:划分为三个区域:原始区(Eden)和两个小的存活区(Survivor),两个存活区按
功能分为 From 和 To。绝大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的
对象放到存活区。垃圾回收绝大部分发生在年轻代。
年老代:存储年轻代中经过多个回收周期仍然存活的对象,对于一些大的内存分配,也可
能直接分配到永久代。
持久代:存储类、方法以及它们的描述信息,这里基本不产生垃圾回收。
有了以上这些铺垫之后开始回答 GC 何时开始:
Eden 内存满了之后,开始 Minor GC(从年轻代空间回收内存被称为 Minor GC);升到老
年代的对象所需空间大于老年代剩余空间时开始 Full GC(但也可能小于剩余空间时,被
HandlePromotionFailure 参数强制 Full GC)
对什么东西操作,即垃圾回收的对象是什么:
从 root 开始搜索没有可达对象,而且经过第一次标记、清理后,仍然没有复活的对象。
做了什么东西:
主要做了清理对象,整理内存的工作。具体的引申如下
垃圾回收器的类型:
串行垃圾回收器(Serial Garbage Collector)
并行垃圾回收器(Parallel Garbage Collector)
并发标记扫描垃圾回收器(CMS Garbage Collector)
G1 垃圾回收器(G1 Garbage Collector)
垃圾回收算法:
引用计数法
标记清除法
复制算法
标记压缩算法
分代算法