浅谈JVM

1.什么叫JVM?

JVM即Java Virtual Machine  Java虚拟机,它最重要的一个功能就是从软件层面上屏蔽不同的操作系统,实现Java语言的跨平台特性。

2.JVM的整体模型和内存结构

在日常面试中,我们被提及到的JVM其实指的是JVM内存模型,这个模型如下图所示(黄色表示所有线程共享,紫色表示每个线程独享一份):

 这些结构可以在官网上看到相关资料:Chapter 2. The Structure of the Java Virtual Machine 

3.栈是用来干嘛的?

此处的栈我们可以称之为线程栈当然官网上说的Java虚拟机栈,之所以称它为线程栈,是因为每当一个线程启动时,栈就会划分一片很小的空间给它使用,而这些空间里又会有很多栈帧,可以认为一个线程中每拥有一个方法,这些栈空间就会划分一个栈帧给该方法;那么栈帧内又有哪些结构呢?大致可以分为四类,局部变量表,操作数栈,动态链接,方法出口。局部变量表顾名思义 存的就是一些局部变量和它们对应的值(比如说程序里a=2,b=3这种 就是存在局部变量表中);操作数栈则是将一些局部变量的值拿出来进行计算并得到相应的结果(比如说a*b 则 2 3 6 都会存在在操作数栈);动态链接可以简单的理解为在程序运行时把符号引用转换成直接引用(为了更好的理解这里解释下,当程序里有个.xxx()方法时,我们知道方法是存在方法区的,而动态链接则是把.xxx()替换成了该方法在方法区所存的详细信息);方法出口则是表示当方法结束之后返回到主方法的位置(这个动作可以理解位我们进入了一段程序的某个方法内,再跳回来)

4.如何理解程序计数器?

程序计数器可以理解为用来记录程序执行到哪一步的结构,这么说可能有点抽象,我们可以利用Javap -c 这个命令将字节码文件转换成Java汇编语言,这样我们就会看到:

 上图用红色框框标出来数字我们就可以理解成计数器记录的数据,至于为啥要记录,大家可以想想多线程的时候,我们程序执行到某个位置后被别的线程抢占了cpu那么当重新回来执行之前没执行完的代码时,不可能从头执行,所以程序计数器就是这个作用。

5.方法区

方法区是存一些常量(常量池,运行时常量池等),静态变量以及一些类信息的一块区域。

6.本地方法栈

可以理解当我们的线程调用到本地方法时,则会分配一定的栈空间给我们,这就时本地方法栈。

7.堆

堆的结构如下:

 

总体分为两快,年轻代和老年代,其中各自占比如上图所示,年轻代中又分为Eden区和Survivor区,他们各自占年轻代的比例如上图所示,至于堆的作用 主要是存对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值