加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java面经

发布时间:2020-12-15 07:53:14 所属栏目:Java 来源:网络整理
导读:JVM知识 : jvm 内存模型分为堆和栈,栈是运行时的单位,堆是存储时的单位. 堆又可以分为方法区和java 堆,栈又可以分为java 栈,本地方法栈和程序计数器. 栈的解析: java 栈的作用:每执行方法时,会为该方法分配一块私属的存储空间叫做栈帧,此栈帧存储

JVM知识:
jvm内存模型分为堆和栈,栈是运行时的单位,堆是存储时的单位.
堆又可以分为方法区和java堆,栈又可以分为java栈,本地方法栈和程序计数器.

栈的解析:
java栈的作用:每执行方法时,会为该方法分配一块私属的存储空间叫做栈帧,此栈帧存储局部变量栈,操作数栈,动态链接,方法出口等信息.
动态链接是指用到某个类再加载进内存而静态链接是将所有的类都加载进内存不论是否用到.class文件的常量池中存在大量的符号引用,这些符号引用在类加载阶段或者直接使用时转化为直接引用,这种转化称为静态引用,相反在运行期间转化为直接引用的称为动态链接.

程序计数器:当前线程所执行字节码的行号指示器.

本地方法栈:是为虚拟机使用到的本地方法服务.

堆的解析:

方法区(元空间):存储被虚拟机加载的类的元数据信息,例如,类名,方法名,父类,接口,静态变量,常量等.该区是被线程共享的.同时这里面也会发生GC,主要是对方法区中的常量池和类型的回收.

java堆:存放new出来的实例对象,而不是引用对象,引用对象是存储在java栈中的局部变量中的.java堆分为年轻代和老年代.方法区称为永久代

JVM的垃圾回收算法:

  (1)标记-清除算法:垃圾收集算法中最基础的.主要思想是标记哪些要被回收的对象,然后统一回收,主要效率不高即标记和清除的效率都很低,还会造成产生大量不连续的内存碎片.导致以后程序在分配较大的对象时,由于没有充足的连续内存而提前触发一次GC动作.

  (2)复制算法:为了解决效率问题,复制算法将内存按容量划分为相等的两部分,然后每次只用其中的一块,当内存用完时,就将存活起来的对象复制到第二块内存中.然后一次性清除第一块内存,再将第二块的对象复制到第一块.此种方法会浪费内存如第二块内存.改进:内存区域不按1:1划分,而是将内存划分为8:1:1,较大的那份内存交到Eden区,其余两块内存叫做survivor区(叫做s1和s2).每次会优先使用Eden区,若Eden区满,就会进行youngGC就将存活对象复制到s1内存区中,然后清除Eden区(此时,s2是空白的,两个Survivor总有一个是空白的).当s1满时也会进行youngGC,将s1中存活的对象送入到s2区,当然s2区满时也会进行youngGC,将s2中存活的对象送入到s1,此时s1和s2交换角色.当在年轻代中的对象经过15此GC后会将存活的对象送入老年代.在发生youngGC时,虚拟机会检查每次晋升进入老年代的大小是否大于老年代的剩余空间大小,如果大于,则直接触发一次Full GC.

  (3)标记-整理:在清除对象时将可回收对象移动到一端,这样就不会产生碎片了.

  (4)分代收集:现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代和老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理 或者 标记-清除。

JMM(java内存模型):

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读