Java虚拟机相关面试题

【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】

**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **

包含:每个栈帧都包含四个区域:局部变量表、操作数栈、动态连接、返回地址。

大小:栈的大小默认为1M,可以用参数 -Xss 调整大小,例如 -Xss256K

虚拟机栈:

局部变量表:用于存放局部变量。主要存储8大基础数据类型。如果是局部的一些对象,例如Object对象,我们只需要存放它的一个引用地址即可。

操作数栈:用于存放我们方法执行的操作数(操作步骤?)。举例:一个方法public void work(){int x=1;int y=2;int z=(x+y)*10; return z;},我们调用 work();

0: iconst_1 将int型1入操作数栈

1: istore_1 将操作数栈中栈顶int型数值出栈,存入局部变量表(下标为1的位置)

2: iconst_2 将int型2入操作数栈

3: istore_2 将操作数栈中栈顶int型数值出栈,存入局部变量表(下标为2的位置)

4: iload_1 将局部变量表中下标为1的int型数据入栈

5: iload_2 将局部变量表中下标为2的int型数据入栈

6: iadd 1)将栈顶两int型数值出栈  2)相加  3)将结果压入操作数栈

7: bipush 10 10的值扩展成int值入操作数栈

9: imul 1)将栈顶两int型数值出栈  2)相乘  3)将结果压入操作数栈

10: istore_3 将操作数栈顶int型数值出栈,存入局部变量表(下标为3的位置)

11: iload_3 将局部变量表中下标为3的int型数据入栈

12: ireturn 将操作数栈栈顶int型数值出栈,从当前方法返回int。

相关内容见17-01-43:24至53:36。

动态连接(17-01-57:00):跟Java语言多态性有关(需要运行时才能确定具体的方法)。

返回地址(也叫完成出口17-01-01:00:00):一个方法完成后,接下来需要执行什么就由这个完成出口决定。正常返回的话,会调用程序计数器中的地址作为返回;异常的话,通过异常处理器表(非栈帧中的)来确定。

本地方法栈(17-02-开始):跟虚拟机栈类似,虚拟机栈用于管理java函数的调用,而本地方法栈用于管理本地方法(native方法,由C语言实现)的调用。

当一个JVM创建的线程调用native方法后,JVM不再为其在虚拟机栈中创建栈帧,JVM只是简单地动态链接并直接调用native方法。

虚拟机规范并无强制规定,各版本虚拟机自由实现本地方法栈。HotSpot直接把本地方法栈和虚拟机栈合二为一。

线程共享(17-02-06:00):

小问题:线程共享为什么要分为方法区和堆,为什么不直接用一块区域?

堆:对象、数组。需要被频繁回收的。

方法区:类信息、常量、静态变量、即时编译期编译后的代码。这些信息被回收的难度是很大的。分为堆和方法区体现了动静结合的思想。即偏静态的数据放在方法区,需要频繁地动态创建和回收的数据放在堆中。

方法区:主要是用来存放已被虚拟机加载的类相关信息,包括类信息、静态变量、常量、运行时常量池、字符串常量池。

:对象实例(几乎所有)、数组。分为新生代和老年代。新生代又分为:Eden空间、From Survivor空间、To Survivor空间,空间大小比例为8:1:1。

1.2、我在new一个对象的时候,它是被放在内存的那一块区域


成员变量和局部变量。

Java中几乎所有的对象实例、数组都会被放在堆中。

堆又分为老年代和新生代。新生代又分为:Eden空间、From Survivor空间、To Survivor空间,空间大小比例为8:1:1。

所以成员变量也会被放在堆中。

而局部变量会被放在虚拟机栈  --> 栈帧的局部变量表中。

局部变量表:用于存放局部变量。主要存储8大基础数据类型。如果是局部的一些对象,例如Object对象,我们只需要存放它的一个引用地址即可。

从垃圾回收方面来讲,局部变量在方法执行结束后就会立即被回收。而成员变量的回收则会根据GC的一套机制来决定是否进行回收。

2、Java内存模型(JMM)

===============

2.1、讲一下Java内存模型


JAVA内存模型(JMM)和JAVA虚拟机内存模型(JVM)

Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。程序中的变量存储在主内存中,每个线程拥有自己的工作内存并存放变量的拷贝,线程读写自己的工作内存,通过主内存进行变量的交互。JMM就是规定了工作内存和主内存之间变量访问的细节,通过保障原子性、有序性、可见性来实现线程的有效协同和数据的安全。

JMM屏蔽了不同操作系统差异,是跨平台可用的内存模型,用来描述线程的数据在何时从主内存读取,何时写入主内存,解决线程间数据共享和传递的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值