JVM内存结构的面试题(阿里云云栖社区 ​)

JVM内存结构的一点问题(阿里云云栖社区 ​)

本文根据阿里云云栖社区文章总结.原文地址 https://zhuanlan.zhihu.com/p/77340044

1、JVM管理的内存结构是怎样的?
主要包含了PC寄存器(程序计数器)、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。

  • 程序计数器
    是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,据此来选取下一条需要执行的字节码指令,它是线程所私有的。

  • java虚拟机栈
    线程私有,生命周期与线程相同,他所描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈,用来存储局部变量表,操作数栈,动态链接等。方法执行的过程就对应入栈和出栈的过程。

  • 本地方法栈
    与java虚拟机栈的作用类似,不过,它不是为java方法服务的,而是为native方法服务的,native方法是与其他语言链接的桥梁。

  • java堆
    被所有线程共享的内存区域,虚拟机启动的时候创建,唯一的目的就是为了存放对象实例。

  • 方法区
    用于存储被虚拟机加载的类信息,常量,静态变量等

  • 运行时常量池(方法区的一部分)
    本机的直接内存

2、运行时数据区中哪些区域是线程共享的?哪些是独享的?
在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。
而Java堆、方法区是线程共享的。但是值得注意的是,Java堆其实还未每一个线程单独分配了一块TLAB空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。

3、除了JVM运行时内存以外,还有什么区域可以用吗?
除了我们前面介绍的虚拟机运行时数据区以外,还有一部分内存也被频繁使用,他不是运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,他就是——直接内存。
直接内存的分配不受Java堆大小的限制,但是他还是会收到服务器总内存的影响。
在JDK 1.4中引入的NIO中,引入了一种基于Channel和Buffer的I/O方式,他可以使用Native函数直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的应用进行操作。

4、堆和栈的区别是什么?
堆和栈(虚拟机栈)是完全不同的两块内存区域,一个是线程独享的,一个是线程共享的,二者之间最大的区别就是存储的内容不同:
堆中主要存放对象实例。
栈(局部变量表)中主要存放各种基本数据类型、对象的引用。

5、Java中的数组是存储在堆上还是栈上的?
在Java中,数组同样是一个对象,所以对象在内存中如何存放同样适用于数组;
所以,数组的实例是保存在堆中,而数组的引用是保存在栈上的。

6、Java中对象创建的过程是怎么样的?
1.虚拟机遇到new指令,到常量池定位到这个类的符号引用。
2.检查符号引用代表的类是否被加载、解析、初始化过。
3.虚拟机为对象分配内存。
4.虚拟机将分配到的内存空间都初始化为零值。
5.虚拟机对对象进行必要的设置。
6.执行方法,成员变量进行初始化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值