JVM学习之路(大白话讲解)

1,当我们运行程序时,程序运行的整个过程

        首先我们编写的java类通过javac命令将java文件编译成class字节码文件,然后通过类装载子系统将class文件装载到java虚拟机内存模型中,然后通过通过字节码执行引擎去执行内存模型中的字节码。

2,内存模型中的栈

      (1)栈主要来存放程序中的局部变量。每当一个线程运行时,就会在栈中为当前线程开辟一块儿内存空间用来存放局部变量。如果还有其他线程,则会在栈中再为其他线程开辟内存空间。为每个线程开辟的内存空间为该线程独有。(先进后出)

      (2)栈内部的结构 

               栈帧:一个方法对应一块栈帧内存区域(也就是当某个线程执行一个方法时,会在该线程栈的内存空间再为方法开辟一小块内存空间来存放自己方法内的局部变量,这也是为什么在一个方法内定义的局部变量不能被别的方法访问的原因。 一方法对应一个栈帧。如图:(2-1)

     (2-1)             (2-2)  

      (3)栈帧内部的结构(如图:2-2)

              局部变量:主要来存放程序方法中的局部变量(这个应该不用说),局部变量也包括对象的地址值(指针),会根据该指针找到在堆里对应的对象

              操作数栈:内部的数据结构也是个栈(先进后出),程序在运行的过程中存放那些操作数的临时的内存空间

              动态链接:

              方法出口:也就是当方法执行过程中调用别的方法,当别的方法执行完成之后需要回到调用别的方法的下一行,而这些信息存放在方法出口。

3,程序计数器(jvm还会为每个线程分配一个程序计数器,字节码执行引擎会修改程序计数器标识的位置)

      程序计数器的作用:每个线程执行的过程中都会有一个计数器来标识当前线程执行的位置。假如别的线程抢占了资源,则该线程挂起,当别的线程执行完成之后,该线程拿到资源后会从程序计数器标记的位置开始执行程序。

4,方法区

      方法区存放一些类信息,常量,静态变量(也可能存放对象的地址值(指针),根据指针也可以找对堆里对应的对象)

 

5,本地方法栈

      主要存放native修饰的本地方法的一些信息(内存数据)。底层是用c语言来实现的。

6,堆

      对主要分为年轻代和老年代,年轻代中有Eden区和Survivor1和Survivor2区。老年代占堆的三分之二的内存,年轻代占堆的三分之一的内存,而Eden区占用年轻代的十分之八,Survivor1和Survivor2分别占用年轻代十分之一的内存。当我们创建对象时,会往年轻代的Eden区存放,当新生代的Eden区放满时就让字节码执行引擎开启一个线程触发minor GC。

7,垃圾回收的过程(可达性分析算法)

      GC Roots(局部变量,静态变量)只要是对象类型的变量都可以作为GC Roots,它会从栈上面和方法区上面找的所有的GC Roots,然后看GC Roots是否引用别的变量,我们把GC Roots引用的这条链路上的所有对象成为非垃圾对象。我们GC的时候会将非垃圾对象复制到Survivor区。然后会把Eden区上所有剩余的所有对象回收。

 

 

未完,持续更新中。。。。。。。。。。

 

说明:本人在学习过程做根据自己的理解所编写,如果错误还希望大佬指正,互相学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值