文章目录
-
- 一、Java内存区域
- 1.1 说一下 JVM 的主要组成部分及其作用?
- 1.2 说一下 JVM 运行时数据区
- 1.3 详细的介绍下程序计数器?
- 1.4 详细介绍下Java虚拟机栈?
- 1.5 一个方法调用另一个方法,会创建很多栈帧吗?递归的调用自己会创建很多栈帧吗?
- 1.6 你能给我详细的介绍Java堆吗?
- 1.7 能不能解释一下本地方法栈?
- 1.8 能不能解释一下方法区
- 1.9 什么是JVM字节码执行引擎
- 1.10 你听过直接内存吗?
- 1.11 深拷贝和浅拷贝
- 1.12 说一下堆栈的区别?
- 1.13 队列和栈是什么?有什么区别?
- 1.14 Java会存在内存泄漏吗?请说明为什么?
- 二、HotSpot虚拟机
- 2.1 对象的创建
- 2.2 为对象分配内存
- 2.3 处理并发安全问题
- 2.4 对象的访问定位
- 2.4.1 句柄访问
- 2.4.2 直接指针
- 2.5 Java会存在内存泄漏吗?请简单描述
- 三、垃圾收集器
- 3.1 简述Java垃圾回收机制
- 3.2 GC是什么?为什么要GC
- 3.3 垃圾回收的优点和原理,并说出2种回收机制
- 3.4 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
- 3.5 Java 中都有哪些引用类型?
- 3.6 怎么判断对象是否可以被回收?
- 3.7 在Java中,对象什么时候可以被垃圾回收
- 3.8 说一下 JVM 有哪些垃圾回收算法?
- 3.8.1 标记-清除算法
- 3.8.2 复制算法
- 3.8.3 标记-整理算法
- 3.8.4 分代收集算法
- 3.9 说一下 JVM 有哪些垃圾回收器?
- 3.10 详细介绍一下 CMS 垃圾回收器?
- 3.10.1 三色标记算法
- 3.11 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别?
- 3.12 介绍一下10种垃圾回收器
- 3.12.1 Serial收集器
- 3.12.2 Serial Old收集器
- 3.12.3 ParNew收集器
- 3.12.4 Parallel Old
- 3.12.5 Parallel Scavenge
- 3.12.6 CMS
- 3.12.7 G1(Garbage First,物理上不分代,逻辑上分代)
- 3.12.8 ZGC
- 3.12.9 Shenandoah
- 3.12.10 java 11 新的Epsilon垃圾收集器
- 3.13 简述分代垃圾回收器是怎么工作的?
- 3.14 堆内存逻辑分区(分代)模型及对象分配逻辑
- 3.14.1 GC相关的概念
- 3.14.2 一个对象的生命之旅(对象分配过程)
- 3.14.3 什么情况下,对象会分配在栈上
- 3.14.4 对象什么时候进入老年代
- 3.14.5 对象的分配总结图
- 3.14.6 JVM参数查看
- 四、虚拟机类加载机制
- 4.1 描述一下JVM加载Class文件的原理机制
- 4.2 什么是类加载器,类加载器有哪些?
- 4.3 说一下类装载的执行过程?
- 4.4 什么是双亲委派模型?
- 五、JVM调优
- 5.1 说一下 JVM 调优的工具?
- 5.2 Java虚拟机参数类型
- 5.3 常用的 JVM 调优的参数都有哪些?
- 一、Java内存区域
一、Java内存区域
1.1 说一下 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)来实现整个程序的功能。
Java程序运行机制步骤
1>首先利用IDE集成开发工具编写Java源代码,源文件的后缀为.java;
2>再利用编译器将源代码编译成字节码文件,字节码文件的后缀名为.class;
3>运行字节码的工作是由解释器(java命令)来完成的。
从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。
其实可以一句话来解释:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。
1.2 说一下 JVM 运行时数据区
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有些区域随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销毁。Java 虚拟机所管理的内存被划分为如下几个区域:
不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:
- 1、程序计数器(Program Counter Register)
1>作用 记录当前线程所执行到的字节码的行号。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 2>意义 JVM的多线程是通过线程轮流切换并分配处理器来实现的,对于我们来说的并行事实上一个处理器也只会执行一条线程中的指令。所以,为了保证各线程指令的安全顺利执行,每条线程都有独立的私有的程序计数器(为什么要线程计数器?因为线程是不具备记忆功能)。
3>存储内容 当线程中执行的是一个Java方法时,程序计数器中记录的是正在执行的线程的虚拟机字节码指令的地址。 当线程中执行的是一个本地方法时,程序计数器中的值为空。 4>可能出现异常 此内存区域是唯一一个在JVM上不会发生内存溢出异常(OutOfMemoryError)的区域。 - 2、Java 虚拟机栈(Java Virtual Machine Stacks)
1>作用 描述Java方法执行的内存模型。每个方法在执行的同时都会开辟一段内存区域用于存放方法运行时所需的数据,成为栈帧,一个栈帧包含如:局部变量表、操作数栈、动态链接、方法出口等信息。
2>意义 JVM是基于栈的,所以每个方法从调用到执行结束,就对应着一个栈帧在虚拟机栈中入栈和出栈的整个过程。
3>存储内容 局部变量表(编译期可知的各种基本数据类型、引用类型和指向一条字节码指令的returnAddress类型)、操作数栈、动态链接、方法出口等信息。 值得注意的是:局部变量表所需的内存空间在编译期间完成分配。在方法运行的阶段是不会改变局部变量表的大小的。
4>可能出现的异常 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。 如果在动态扩展内存的时候无法申请到足够的内存,就会抛出OutOfMemoryError异常。 - 3、本地方法栈(Native Method Stack)
1>作用 为JVM所调用到的Nativa即本地方法服务。(虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;Native 关键字修饰的方法是看不到的,Native 方法的源码大部分都是 C和C++ 的代码) 2>可能出现的异常 和虚拟机栈出现的异常很相像。 - 4、Java 堆(Java Heap)
1>作用所有线程共享一块内存区域,在虚拟机开启的时候创建。 2>意义 1、存储对象实例,更好地分配内存。 2、垃圾回收(GC)。堆是垃圾收集器管理的主要区域。更好地回收内存。 3>存储内容 存放对象实例,几乎所有的对象实例都在这里进行分配。堆可以处于物理上不连续的内存空间,只要逻辑上是连续的就可以。 值得注意的是:在JIT编译器等技术的发展下,所有对象都在堆上进行分配已变得不那么绝对。有些对象实例也可以分配在栈中。 4>可能出现的异常 实现堆可以是固定大小的,也可以通过设置配置文件设置该为可扩展的。 如果堆上没有内存进行分配,并无法进行扩展时,将会抛出OutOfMemoryError异常。 - 5、方法区(Methed Area)
1>作用 用于存储运行时常量池、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 2>意义 对运行时常量池、常量、静态变量等数据做出了规定。 3>存储内容 运行时常量池(具有动态性)、已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 4>可能出现的异常 当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

最低0.47元/天 解锁文章
86万+

被折叠的 条评论
为什么被折叠?



