先给大家看两个图,区分一下概念

                                                        图一

 

                                                      图二

很多面试官问内存模型的时候,很多人回答的堆栈方法区等,这是概念混淆,接下来分别说一下自己的理解       

      每个点可能会有累赘和过分详细的地方,因为主要是自己笔记,也是自己第一次写,有错误的地方请大家指出,不喜勿喷         主要自我记录 主要自我记录 主要自我记录

1.jvm内存结构

 程序计数器:内存空间比较小,是执行线程所执行的字节码行号指示器,指向下一个将要执行的指令代码,由执行引擎来读取下一条指令,如果是Native方法,计数器的值为Undefined,在多线程中,

为了让线程切换回来(上下文)后恢复原来的执行指令,计数器是线程所有

:内存中最大的一块,所有对象实例,大部分非静态的成员变量,java数组的存放区域,生命周期和虚拟机一样,线程共享,所以操作共享区域就有了锁和同步,堆是GC主要作用的地方

   补充:

   垃圾回收算法

       Mark-Sweep(标记-清除) 分为两个阶段,标记和清理,标记是根据可达性算法判定垃圾对象,然后统一完成清理,优点:实现简单  缺点:效率低,产生不连续的碎片,可能较大对象分配空间找不到足够的连续空间

       Copying(复制清除算法)两块大小相等的内容量,每次只用一块,这块内存用完之后把存活的对象复制到另一块内存区间,然后把已经使用的那块清除掉,适用于年轻代  优点:效率高,不容易产生碎片,缺点:可用空间少(因为分成两块了),存活对象多时效率低,

                                                 现在商业的虚拟机就采用的copy清除,HotSpot虚拟机默认eden:survivor(from:to)= 8:1:1,因为存活对象会很少,每次清理就把eden和survivor中的存活对象复制到另一个survivor上,这样只有10%的空间浪费,如果存在survivor

                                                 不够用时,需要依赖老年代分担,大对象直接进入老年代

       Mark-Compact(标记-整理) 老年代因为对象存活率高,所以复制算法已经不适用了,就出现了标记整理算法,存活对象移到一边,清理掉边界以外的内存   优点:不容易产生碎片,内存利用搞   缺点:存活对象多且分散时,移动次数多,效率低下

      分代收集  :把堆分成新生代和老年代(永久代指方法区)

       新生代:每次有大量的对象死去,只有少数存活,采用复制算法

       老年代:对象存活率高,没有额外的空间分配,采取标记清楚或者标记整理

       增量算法:因为垃圾回收非常占用cpu,导致应用程序会被挂机,等垃圾回收结束,会影响用户体验和系统稳定性,所以采用应用程序线程和垃圾收集线程交替切换,反复一直到垃圾收集完

                         缺点:上下文切换消耗,总体成本变高,吞吐变低

          1.分代的原因:不同生命周期的对象,采用不同的收集方式,可以提高效率    好处:a.新对象的内存分配只在新生代,简单了  b.更有效的清理死亡对象

          2.垃圾回收触发:新生代内存空间不足时,触发

 堆内存划分:年轻代,老年代,永久代(java8之后永久代移除,换成metaspace代替)

   

 java虚拟机栈:jvm中的栈有包含两个虚拟机栈和本地方法栈(也就是分别对应图一的栈和本地方法区,个人习惯),存放基本类型,对象引用,方法出口,

2.jvm内存模型

posted on 2020-03-16 14:48  粑粑蛋  阅读(179)  评论(0)    收藏  举报