面试官的灵魂拷问系列----关于JVM

  • 简单介绍下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()得到的结果相同吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值