java 内存 开发 经验_2020年面试官最喜欢问的16道Java内存模型面试题,2021年肯定还要问!...

前言

对于一名 Java 工程师来说,JVM 可以说是面试必问的一个知识点,而大多数人可能没有对 JVM 的实际开发和使用经验,毕竟在工作中用到的很少,甚至说没有接触过,但是在我们技术晋升时,我们必须对 JVM 理解,知道它是什么?在项目中遇到性能问题又该怎么做?这一篇文章将带你深入了解 JVM 需要掌握的各个知识点。这也将帮助你完成从对 JVM 零接触到深入理解的转变,小编这里还整理了一份详细的JVM性能优化的思维导图,需要的朋友可以点击看看呢,关注公众号:麒麟改bug。

eaa17f140bd8db7eb1852fa013a4608b.png

Java内存模型

1. 我们开发人员编写的Java代码是怎么让电脑认识的首先先了解电脑是二进制的系统,他只认识 01010101

比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的

HelloWord.java是我们程序员编写的,我们人可以认识,但是电脑不认识

Java文件编译的过程

1. 程序员编写的.java文件

2. 由javac编译成字节码文件.class:(为什么编译成class文件,因为JVM只认识.class文件)

3. 在由JVM编译成电脑认识的文件 (对于电脑系统来说 文件代表一切)

b47934ca3953a4613b308e72ef6231e5.png

2. 为什么说java是跨平台语言这个夸平台是中间语言(JVM)实现的夸平台

Java有JVM从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统

难道 C 和 C++ 不能夸平台吗 其实也可以 C和C++需要在编译器层面去兼容不同操作系统的不同层面,写过C和C++的就知道不同操作系统的有些代码是不一样

3. Jdk和Jre和JVM的区别Jdk包括了Jre和Jvm,Jre包括了Jvm

Jdk是我们编写代码使用的开发工具包

Jre 是Java的运行时环境,他大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基础的类库

Jvm俗称Java虚拟机,他是java运行环境的一部分,它虚构出来的一台计算机,在通过在实际的计算机上仿真模拟各种计算机功能来实现Java应用程序

看Java官方的图片,Jdk中包括了Jre,Jre中包括了JVM

38b5368fd8edcca42bbf0b9f27daf6fe.png

4. 说一下 JVM由那些部分组成,运行流程是什么?JVM包含两个子系统和两个组件: 两个子系统为Class loader(类装载)、Execution engine(执行引擎); 两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。

Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到

Runtime data area中的method area。

Execution engine(执行引擎):执行classes中的指令。

Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。

Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。

流程 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

5. 说一下 JVM 运行时数据区Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁。Java 虚拟机所管理的内存被划分为如下几个区域:

简单的说就是我们java运行时的东西是放在那里的

f9f3b5886a168472fdae5ef43f835ccf.png程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;

为什么要线程计数器?因为线程是不具备记忆功能Java 虚拟机栈(Java Virtual Machine Stacks):每个方法在执行的同时都会在Java 虚拟机栈中创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息;

栈帧就是Java虚拟机栈中的下一个单位本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;

Native 关键字修饰的方法是看不到的,Native 方法的源码大部分都是 C和C++ 的代码Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;

方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。

后面有详细的说明JVM 运行时数据区

6. 详细的介绍下程序计数器?(重点理解)

1. 程序计数器是一块较小的内存空间,它可以看作是:保存当前线程所正在执行的字节码指令的地址(行号)

2. 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储。称之为“线程私有”的内存。程序计数器内存区域是虚拟机中唯一没有规定OutOfMemoryError情况的区域。

总结:也可以把它叫做线程计数器

**例子:**在java中最小的执行单位是线程,线程是要执行指令的,执行的指令最终操作的就是我们的电脑,就是 CPU。在CPU上面去运行,有个非常不稳定的因素,叫做调度策略,这个调度策略是时基于时间片的,也就是当前的这一纳秒是分配给那个指令的。

假如:

线程A在看直播

431e2731c6d919494acff71e050b0863.png

7. 详细介绍下Java虚拟机栈?

一个方法调用另一个方法,会创建很多栈帧吗?

栈指向堆是什么意思?

递归的调用自己会创建很多栈帧吗?

8. 你能给我详细的介绍Java堆吗?(重点理解)

9. 能不能解释一下本地方法栈?

10. 能不能解释一下方法区(重点理解)

11. 什么是JVM字节码执行引擎

12. 你听过直接内存吗?

13. 知道垃圾收集系统吗?

14. 堆栈的区别是什么?

15. 深拷贝和浅拷贝浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,

深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,

浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

16. Java会存在内存泄漏吗?请说明为什么?内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除。

但是,即使这样,Java也还是存在着内存泄漏的情况,java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露, 尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收 ,这就是java中内存泄露的发生场景。

总结

最后来自小编的福利

以上面试题及资料小编以及整理成文档【附答案】这里还总结了 Java虚拟机(JVM)面试题 51道+Java虚拟机:JVM高级特性与最佳实践400多页的资料、spring、mybatis、jvm,Zookeeper,spring】 关注公众号:麒麟改bug ,编程的世界永远向所有热爱编程的人开放,这是一个自由,平等,共享的世界,我始终是这样坚信的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值