java-JVM

JVM体系结构

      jvm主要由类装载器子系统,堆,栈,方法区,本地方法栈,执行引擎,垃圾回收系统和PC寄存器(program control)组成。

      类装载器子系统:把 .java文件翻译成 。class文件并加载到内存中。

      堆:存储Java程序创建的实例(通过new方法创建的对象或者是spring中从容器中获得的对象),数组对象等,是所有线程共享的。

      栈:栈是线程私有的,当调用方法时,JVM压入一个新的栈针到栈中,当方法执行完并返回时,栈针会从栈中弹出并抛弃。栈主要存储的是基本数据类型的局部变量,对象的引用等。

      方法区:存储已被JVM加载的类信息,常量,静态变量。所有的线程共享方法区。

      本地方法栈:为虚拟机使用到的native方法服务,因为是本地方法,JVM会保持java栈针不变,只是简单的连接并直接调用本地指定的方法。

     执行引擎:相当于线程,解析JVM字节码文件,负责调度(方法的调用)。是整个执行过程的最初始的一步。

    垃圾回收系统:GC(garbage collection)是指我们的应用程序不在用的对象(视为垃圾),应该释放垃圾所占用的内存(是对象所占用的内存,而非对象本身)。那么垃圾回收有几种方法呢?请接着往下看。

                        引用计数法:在java中对象的引用和对象本身是多对一的关系,即可以有多个引用指向同一个内存地址。比如Person p = new Person(); Person p1 = p;  执行完之后就会放生p和p1同时执行堆中的对象的首地址。若一个对象没有任何对象与之相关联,则这个对象就很难再被用到,此时就成为了“垃圾”,等待回收。(此种方式解决循环引用会有一定的问题,两个对象都不在使用,但是互相引用使得无法被回收)

                        可达性分析法:通过一系列的对象作为起点进行搜索,如果总会和其中的某些对象没有可达的路径,则对象是不可达的,即为“垃圾”对象,等待回收(一般情况下需要经历两次的标记过程都不可达,会被判定为“垃圾”)。还有一个问题我们应该选择什么样的对象作为起始点呢?首先应该选择一些生命周期长的对象,不应该用局部变量,此处不再详细赘述。一般情况下可以作为gcroot的对象:

  •                                       JVM栈中所引用的对象
  •                                       方法区的类的静态属性所引用的对象
  •                                       方法区中常量所引用的对象
  •                                       本地方法栈中本地方法所引用的对象        

                         标记-清除算法:此方法分为两个阶段即标记和清除。

                                                  标记  --  标记出所有需要被回收的对象的内存

                                                  清除  --  一次性清除掉所有标记的对象的内存

                                                 (容易产生内存的碎片,无法使用)

                       复制算法:将内存分为大小相等的两块,每次只是用其中的一块,当一块内存用完了,就将存活的对象复制到另                                          一块内存上,然后将使用的内存一次性的清理掉。(解决了内存碎片的问题,但是能够使用的内存也变为了原来的一半,空间利用率下降了一半)

                       标记-整理算法:

                                             标记  --  标记出所有需要被回收的对象

                                             整理  --  将存活的对象向一端移动,一次性清理掉边界以内的对象的内存

                      分代收集算法:将堆区分为老年代,新生代和持久带。

                                              新生代按照8:1:1的比例将内存分为一个Eden区和两个survivor区,大部分对象在eden区生成,                                                  回收时将Eden区存活的移入survivorA区中,清空eden区。若A满,就存入B区,清空eden区。                                                  B区满时存入老年代,老年代已满,则会触发一次GC。

    PC寄存器(程序控制寄存器):当我们启动一个线程时,JVM都会为当前的线程创建一个自己的PC寄存器,作用是保存将要执行的指令的地址,以确保是整个程序非常perfect的完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值