jvm 知识点整理

最近想回顾下自己看的知识点。对它进行整理,查缺补漏。其中有错误的和不足地方,也希望各位提出。大家一起进步

其实对java的虚拟机之间的东西,自己很长时间其实是没有太怎么深入了解的。后面也是在面试中遇到面试的问题,自己才在之后。才去看了,了解。但是在看之后。确实感觉之间让人迷迷糊糊的。下面我就梳理下自己对jvm的理解。

1.jvm 的内存的的划分,主要是分为栈,堆着两大内存区域,但是其里面还有一些详细的划分,如图:

方法区:用来存储类的名称以及相关信息,想常量池也在此中

对象创建区:主要是new的对象的保存区域:一个对象是由三个部分组成的:对象头,实体数据,对齐填充

计数器:是jvm里面用来控制执行顺序的。

jvm栈:存储的是如创建的局部变量等内容。

本地方法区:jvm自带的执行方法等

对象

       对象头:包含了锁的状态,hash,偏移id,偏移时间戳等内容。

       实体数据:对象创建的具体的属性,方法。

       对齐填充:就是一块小的内存区域。

jvm gc回收机制

        因为jvm里面是java运行的时候,需要在其中创建大量的对象。如果创建的对象所使用的内存超过服务器的内存,就会出现内存溢出的问题。为了避免内存溢出。就需要对jvm中已经不使用的对象进行删除处理。这就是gc存在的意义。

        gc回收对象的时候,首先会对对象进行标记,如果符合回收的条件,就会将其放入一个待回收的队列中,但是进入这队列,就不是代表着这个对象一定会被回收。其还会被finilize()方法区判断的。在进入待回收队列的时候,这个对象会通过可达性分析来判断是否进入回收。可达性判断就是每一个有用的对象,在gcsortzet的这个区里面,都有一个gcroot对象引起它,如果没有,就会将没有被对象引用指向的对象放入待回收队列,等待finilize()方法来判断其是否会被回收。如果不能回收。改对象就会成为老年代对象。与老年代对象对应的是新年代对象。新年代对象就是没有经历过gc回收判断的对象。实际情况中,很多的新年代对象都会被在回收判断的时候被回收,而幸存下来的成为老年代对象是很少的。因为这个原因。所以,对新年代对象进行回收的算法和老年代回收的算法有不一样

复制算法:

       其原理就是在堆内存中,将对象化为两个区域,其中一个大的名叫Eden区,主要放入新年代的对象,一个小的名叫survior的区,主要放入老年代的对象。当进行gc回收判断的时候。就会在开辟一个小的区域,也叫survior,这三个区域比例可以是8:1:1的比例。在新开的survior中对对象惊醒判断。净不需要回收的对象放入剩下的那个survior。这样做的好处是,能够将gc回收的限制在很小的内存区域,从而减少对内存的压力。但是效率不够高。

标记-清除/整理:

        其实直接对经过finilize()标记之后的对象进行回收,这样的好处是效率高,但是消耗的内存高。

所以针对上面的两种算法,gc设计了几种垃圾回收器:其大至就是流程如图:不同就是在对对象的处理是,是开启多线程还是单线程来调用算法来对新年代和老年代的对象进行处理