万万没想到,JVM内存结构的面试题可以问的这么难?

在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。

那么,请大家尝试着回答一下以下问题:

1、JVM管理的内存结构是怎样的? 
2、不同的虚拟机在实现运行时内存的时候有什么区别? 
3、运行时数据区中哪些区域是线程共享的?哪些是独享的? 
4、除了JVM运行时内存以外,还有什么区域可以用吗? 
5、堆和栈的区别是什么? 
6、Java中的数组是存储在堆上还是栈上的? 
7、Java中的对象创建有多少种方式? 
8、Java中对象创建的过程是怎么样的? 
9、Java中的对象一定在堆上分配内存吗? 
10、如何获取堆和栈的dump文件?

以上10道题,如果您可以全部准确无误的回答的话,那说明你真的很了解JVM的内存结构以及内存分配相关的知识了,如果有哪些知识点是不了解的,那么本文正好可以帮你答疑解惑。

JVM管理的内存结构是怎样的?

Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。《Java虚拟机规范》中规定了JVM所管理的内存需要包括一下几个运行时区域:

主要包含了PC寄存器(程序计数器)、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。

各个区域有各自不同的作用,关于各个区域的作用就不在本文中相信介绍了。

但是,需要注意的是,上面的区域划分只是逻辑区域,对于有些区域的限制是比较松的,所以不同的虚拟机厂商在实现上,甚至是同一款虚拟机的不同版本也是不尽相同的。

不同的虚拟机在实现运行时内存的时候有什么区别?

前面提到过《Java虚拟机规范》定义的JVM运行时所需的内存区域,不同的虚拟机实现上有所不同,而在这么多区域中,规范对于方法区的管理是最宽松的,规范中关于这部分的描述如下:

方法区在虚拟机启动的时候创建,虽然方法区是堆的逻辑组成部分,但是简单的虚拟机实现可以选择在这个区域不实现垃圾收集与压缩。本版本的规范也不限定实现方法区的内存位置和代码编译的管理策略。方法区的容量可以是固定的,也可以随着程序执行的需求动态扩展,并在不需要过多的空间时自行收缩。方法区在实际内存空间站可以是不连续的。

这一规定,可以说是给了虚拟机厂商很大的自由。

虚拟机规范对方法区实现的位置并没有明确要求,在最著名的HotSopt虚拟机实现中(在Java 8 之前),方法区仅是逻辑上的独立区域,在物理上并没有独立于堆而存在,而是位于永久代中。所以,这时候方法区也是可以被垃圾回收的。

实践证明,JVM中存在着大量的声明短暂的对象,还有一些生命周期比较长的对象。为了对他们采用不同的收集策略,采用了分代收集算法,所以HotSpot虚拟机把的根据对象的年龄不同,把堆分位新生代、老年代和永久代。

在Java 8中 ,HotSpot虚拟机移除了永久代,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)

运行时数据区中哪些区域是线程共享的?哪些是独享的?

在JVM运行时内存区域中,PC寄存器、虚拟机栈和本地方法栈是线程独享的。

而Java堆、方法区是线程共享的。但是值得注意的是,Java堆其实还未每一个线程单独分配了一块TLAB空间,这部分空间在分配时是线程独享的,在使用时是线程共享的。

除了JVM运行时内存以外,还有什么区域可以用吗?

除了我们前面介绍的虚拟机运行时数据区以外,还有一部分内存也被频繁使用,他不是运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域,他就是——直接内存。

直接内存的分配不受Java堆大小的限制,但是他还是会收到服务器总内存的影响。

在JDK 1.4中引入的NIO中,引入了一种基于Channel和Buffer的I/O方式,他可以使用Native函数直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的应用进行操作。

堆和栈的区别是什么?

堆和栈(虚拟机栈)是完全不同的两块内存区域,一个是线程独享的,一个是线程共享的,二者之间最大的区别就是存储的内容不同:

堆中主要存放对象实例。 
栈(局部变量表)中主要存放各种基本数据类型、对象的引用。

Java中的数组是存储在堆上还是栈上的?

在Java中,数组同样是一个对象,所以对象在内存中如何存放同样适用于数组;

所以,数组的实例是保存在堆中,而数组的引用是保存在栈上的。

Java中的对象创建有多少种方式?

Java中有很多方式可以创建一个对象,最简单的方式就是使用new关键字。

User user = new User();

除此以外,还可以使用反射机制创建对象:

User user = User.class.newInstance();

或者使用Constructor类的newInstance:

Constructor<User> constructor = User.class.getConstructor();
User user = constructor.newInstance();

除此之外还可以使用clone方法和反序列化的方式,这两种方式不常用并且代码比较复杂,就不在这里展示了,感兴趣的可以自行了解下。

Java中对象创建的过程是怎么样的?

对于一个普通的Java对象的创建,大致过程如下:

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

Java中的对象一定在堆上分配内存吗?

前面我们说过,Java堆中主要保存了对象实例,但是,随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。

其实,在编译期间,JIT会对代码做很多优化。其中有一部分优化的目的就是减少内存堆分配压力,其中一种重要的技术叫做逃逸分析。

如果JIT经过逃逸分析,发现有些对象没有逃逸出方法,那么有可能堆内存分配会被优化成栈内存分配。

10、如何获取堆和栈的dump文件?

Java Dump,Java虚拟机的运行时快照。将Java虚拟机运行时的状态和信息保存到文件。

可以使用在服务器上使用jmap命令来获取堆dump,使用jstack命令来获取线程的调用栈dump。

 

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Serverless 落地挑战与蚂蚁金服实践

目前 Serverless 已成为云原生社区关注的重点之一&#xff0c;有人说它是微服务的继承者&#xff0c;将会彻底改变软件研发的现状&#xff0c;那么真实情况如何呢&#xff1f;本文将介绍 Serverless 市场观察、落地挑战&#xff0c;以及蚂蚁金服对 Serverless 的实践。 Server…

python3-numpy数组广播 和 np.tile 扩展数组

1、数组广播 import numpy as np""" 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式&#xff0c; 对数组的算术运算通常在相应的元素上进行。 如果两个数组 a 和 b 形状相同&#xff0c;即满足 a.shape b.shape&#xff0c;那么 a*b 的结…

程序员感叹一年只能存下15万太少了……网友:潸然泪下

最近有程序员网友晒出自己的年终奖&#xff0c;税后高达15.7万&#xff01;看到这个情形&#xff0c;很多网友表示自己“被打鸡血了”。他强调学习的重要性&#xff0c;学习仍然是在这个时代下&#xff0c;普通人能够逆袭&#xff0c;给家人更好生活的一把利器&#xff01;今天…

linux 添加sftp用户

-- 创建fxq用户&#xff0c;指定用户家目录为/app/fis/data/fxq 指定Uid为503 useradd fxq -d /app/fis/data/fxq -g sftp -u 503-- 给指定fxq用户设置密码 passwd fxq 略cd /app/fis/data/fxq--级联创建fxq相关目录 mkdir /app/fis/data/fxq/send /app/fis/data/fxq/send/gwl …

机器学习工程师第一年的12点体会

机器学习和数据科学都是广义上的术语&#xff0c;它们涉及超级多的领域以及知识&#xff0c;一位数据科学家所做的事情可能与另一位有很大的不同&#xff0c;机器学习工程师也是如此。通常使用过去&#xff08;数据&#xff09;来理解或预测&#xff08;构建模型&#xff09;未…

python3-numpy np.nditer 迭代数组、np.nditer修改数组、np.nditer广播迭代

1、基本使用 import numpy as np""" NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。 迭代器最基本的任务的可以完成对数组元素的访问。 """ a np.arange(6).reshape(2,3) print (原始数组是&#xff1a;) pri…

AI和机器学习如何改善用户体验?

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;可以做些什么来改善客户体验&#xff1f;自从网上购物开始以来&#xff0c;AI和ML已经密切参与整个网上购物流程。如果没有获得购物建议&#xff0c;你可能无法享受到淘宝或任何其他购物网站的优质服务…

今天下午三点,2020深圳开放数据应用创新大赛将举行第二场线上推介会

4月27日15:00 - 16:30&#xff0c;网易客户端、ZAKER、华为云、南方 plus、虎牙在线直播每场线上推介会设两轮抽奖&#xff0c;欢迎互动。继4月20日首场线上推介会顺利举行后&#xff0c;4月27日下午&#xff0c;以"数聚粤港澳&#xff0c;智汇大湾区"为主题的"…

解决Another app is currently holding the yum lock; waiting for it to exit...问题

在下载安装lrzsz时出现Another app is currently holding the yum lock; waiting for it to exit...问题yum被锁定了可以使用 rm -rf /var/run/yum.pid 强制杀死进程来解决

优化 Tengine HTTPS 握手时间

背景 网络延迟是网络上的主要性能瓶颈之一。在最坏的情况下&#xff0c;客户端打开一个链接需要DNS查询&#xff08;1个 RTT&#xff09;&#xff0c;TCP握手&#xff08;1个 RTT&#xff09;&#xff0c;TLS 握手&#xff08;2个RTT&#xff09;&#xff0c;以及最后的 HTTP …

python3-numpy 数组操作--修改数组形状、翻转数组、修改数组维度、连接数组、分割数组、数组元素的添加与删除

1、修改数组形状 函数描述reshape不改变数据的条件下修改形状flat数组元素迭代器flatten返回一份数组拷贝&#xff0c;对拷贝所做的修改不会影响原始数组ravel返回展开数组 1.1 numpy.reshape numpy.reshape 函数可以在不改变数据的条件下修改形状&#xff0c;格式如下&#…

十周年再发重磅新品,小米发布50倍潜望式变焦小米10青春版、MIUI 12

2020年4月27日&#xff0c;小米集团旗下小米品牌举办新品发布会&#xff0c;小米10青春版、MIUI12两款重磅新品正式发布&#xff0c;一同亮相的还有小米手表Color X Keith Haring联名版和小米蓝牙耳机Line Free。小米10青春版是一款从「做好年轻人最在乎的基本性能」&#xff0…

揭秘!如何用Flutter设计一个100%准确的埋点框架?

阿里妹导读&#xff1a;用户行为埋点是用来记录用户在操作时的一系列行为&#xff0c;也是业务做判断的核心数据依据&#xff0c;如果缺失或者不准确将会给业务带来不可恢复的损失。闲鱼将业务代码从Native迁移到Flutter上过程中&#xff0c;发现原先Native体系上的埋点方案无法…

安装rzsz

yum install -y lrzsz

编码规范 | Java函数优雅之道(下)

上文背景 本文总结了一套与Java函数相关的编码规则&#xff0c;旨在给广大Java程序员一些编码建议&#xff0c;有助于大家编写出更优雅、更高质、更高效的代码。 内部函数参数尽量使用基础类型 案例一&#xff1a;内部函数参数尽量使用基础类型 现象描述&#xff1a; // 调…

python3-numpy IO load()、save()、savez()、loadtxt()、savetxt()、tofile()、fromfile()

Numpy 可以读写磁盘上的文本数据或二进制数据。 NumPy 为 ndarray 对象引入了一个简单的文件格式&#xff1a;npy。 npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。 常用的 IO 函数有&#xff1a; load() 和 save() 函数是读写文件数组数据的两个主要函数…

抽象思想解读Linux进程描述符

来源 | 嵌入式客栈责编 | Carol头图 | CSDN 下载自视觉中国内核是怎么工作的&#xff1f;首先要理解进程管理&#xff0c;进程调度&#xff0c;本文开始阅读进程管理部分&#xff0c;首先从进程的抽象描述开始。抽象是软件工程的灵魂&#xff0c;而对于Linux操作系统而言&#…

CentOS Linux 7.7 安装kafka zookeeper

文章目录一、软件下载1. zookeeper2. kafka二、安装与启动2.1. jdk2.2. zookeeper2.3. kafka三、 kafka 基本演示一、软件下载 1. zookeeper http://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz 2. kafka https://archive.apach…

《Java开发手册》2019最新版发布!

致全球Java开发者&#xff1a; 代码是二进制世界的交流方式&#xff0c;极致的代码是我们的荣耀。 2017年春天&#xff0c;《阿里巴巴Java开发手册》发布&#xff0c;我们希望在涵盖编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程规约、设计规约等7个维度上为开…

IDEA 惊天 bug:进程已结束,退出代码 1073741819

来源 | 沉默王二责编 | Carol头图 | CSDN 下载自视觉中国今天要写的文章中涉及到一串代码&#xff0c;关于 Undertow 的一个入门示例&#xff0c;贴出来大家看一下。public class UndertowTest {public static void main(final String[] args) {Undertow server Undertow.buil…