909422229_理解JVM虚拟机的原理、工作流程

以下答案均为参考网上答案与个人理解的整理总结,如有意见不同欢迎留言探讨。

一、请简单描述一下JVM加载class文件的原理是什么?

JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。类加载器加载到到JVM中才能运行。类加载器本身也是一个类,他负责把class文件从硬盘读取到内存中。我们几乎不需要关心类的加载,因为这些都是隐式装载的,除非我们有特殊的用法,像是反射,就需要显式的加载所需要的类。

类加载过程

加载:通过一个类的全限定名找到对应的class文件,加载进内存,并创建对应的Class对象;

验证:检查 class文件是否符合当前jvm的要求;

准备:为类变量分配内存,并初始化为默认的零值;如果类变量被final修饰,则初始化为当前值;

解析:将常量池中的符号引用替换为直接引用。

初始化:运行代码中的赋值语句与静态块。

 

类装载方式,有两种
(1)隐式装载,程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中,
(2)显式装载,通过class.forname()等方法,显式加载需要的类 ,隐式加载与显式加载的区别:两者本质是一样的。

Java类的加载是动态的,它并不会一次性将所有类全部加载后再运行,而是保证程序运行的基础类(像是基类)完全加载到jvm中,至于其他类,则在需要的时候才加载。这当然就是为了节省内存开销。

二、 JVM最大内存限制多少?如何合理分配?

(1)堆内存分配

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存
的1/4。默认空余堆内存小 于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会
减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、 -Xmx相等以避免在每次GC后调整堆的大小。

(2)非堆内存分配

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存
的大小,默认是物理内存的1/4。

(3)VM最大内存

首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的
关系。简单的说就32位处理器虽 然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是
2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系 统下为2G-3G),而64bit以上的处理器就不会有
限制了。

三、请问什么是JAVA内存模型?

Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。

本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。其关系模型图如下图所示:

三、GC中如何判断对象是否需要被回收或者说JVM如何进行垃圾回收?

作用:顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。

这里博主附上一个很详细的介绍地址:http://www.sohu.com/a/328033201_463994

下面是经过查找其他资料总结一下,可能总结不到位。

判断对象是否存活,有两种算法:

引用计数法:
每当一个对象被引用,就将此对象的计数器+1,引用失效计数器-1,如果引用计数器为零则对象可被回收。
很难解决相互引用的问题。

可达性分析发(根搜索算法):
通过一系列称作“GC ROOTS”的对象作为起始点,将所有的对象看作节点,如果一个对象持有另一个对象的
引用,就代表一个对象到另一个对象可达,从GC ROOTS开始遍历,没有被遍历到的对象代表可被回收。

可作为GC ROOTS的对象:
- 桟中方法变量的引用对象,
- 方法区中类变量的引用对象,
- 方法区中常量引用的对象,
- 本地方法桟中JNI引用对象。
标记-清除算法:
- 标记存活对象,清除其余对象;容易产生内存碎片。
- 坏处:降低内存使用率。

复制算法:
- 每次使用一般=半内存空间,回收时将存活对象复制到另一半内存空间。
- 好处:克服标记-清除算法产生内存碎片的问题;
- 坏处:并不适合存活对象较多的场合,如老年代,浪费内存空间。

标记-压缩算法:
- 标记存活对象,回收时,将将存活对象压缩到一边,清除边界外的区域。
- 好处:克服了复制算法的空间浪费的问题。
- 坏处:适合存活对象较多的场景,如老年代。

分代回收算法:
- 根据对象的生存周期分为新生代与老年代。根据不同的代选取不同的算法,新生代使用复制算法,因为对象
朝生暮死,复制对象效率高,工作量也小;老年代使用标记-压缩或者标记-清除算法。

 

 四、请说明一下双亲委派模式?

即如果加载器遇到一个加载某类的请求,会将此请求委托给它的父类进行加载,如果父类不能加载再自己加载。
好处: 避免重复加载,核心API类型不会随意更改。

五、请简单描述一下JVM分区都有哪些?

java内存通常被划分为5个区域:程序计数器(Program Count Register)、本地方法栈又叫常量池(Native Stack)、方法区(Methon Area)、栈(Stack)、堆(Heap)。

如何解决了您的问题,还希望来JAVA WEB开发交流群:958923746,有问题欢迎共享,共同提升!

添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

75888丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值