- 简单介绍下JVM。
JVM本质来说就是一个程序,对于操作系统来说他就是一个进程,他向操作系统申请了内存区域,有JVM中的线程共享。JVM在程序方面分为线程共享的内存区域,包括栈,程序计数器,本地方法栈。和线程非共享的内存区域,包括堆,方法区。
JVM是实现Java的平台无关性的关键。编译程序需要生成字节码文件,就可以在不同平台的Java虚拟机上运行。
- 简述Minor GC和Major GC的过程
------------------minor GC----------------
1. 新创建对象放在Eden区,当Eden区存满,触发一次Minor GC。如果是大对象,存放在老年代。
2. 将存活的对象岁数加1,存放在空的Survivor区。如果岁数默认达到15,将对象升级到老年代。
3. 清除掉原Survivor和Eden区。
----------------major GC-------------------
1. 当老年代无法分配对象时,会触发一次full gc
2. 如果使用的是CMS收集器,他的过程是初始标记,需要stop the world,标记Gc Roots能直接关联的对象
3. 并发标记。从GC Roots的直接关联对象开始遍历一整个对象图。
4. 重新标记。重新标记由于程序运作导致标记变动的一部分对象
5. 并发清除。删除掉标记阶段认定已死的对象。
- JMM是什么
Java虚拟机围绕着在并发过程中如何处理可见性、原子性、有序性这三个特性而建立的模型。
JMM规定所有变量都存储在主内存,每个线程有自己的工作内存,线程的工作内存中保存了主内存的变量拷贝。线程对变量的操作只能在工作内存。线程之间不能互相访问工作内存,只能通过主内存通信。本地内存是一个抽象概念,他涵盖了缓存,缓冲区等。
JMM的原子性:基本数据类型的读写一般是原子的。
JMM的可见性:共享变量写入主内存,另一个线程读取保证可见性。
JMM的有序性:对于单线程,as-if-serial,对于程序中有依赖关系的,存在happens-before关系,使得看起来像是顺序执行。
对于多线程,不保证正确同步。
- JVM怎么检查死锁?
1. JConsole可以查看,选择线程。
2. jstack可以查看
- 一个ArrayList的两个对象的getClass()得到的结果相同吗?