Java常见问题(二十三):JVM中的区域是怎么划分的?

题目分析:暂无

【回答】

粗略分来,JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统(Runtime Data Area)运行时数据区,和执行引擎。各自的功能为: 类装载器装载负责装载编译后的字节码,并加载到运行时数据区,然后执行引擎执行会执行这些字节码。
Java常见问题(二十三):JVM中的区域是怎么划分的?_第1张图片
图片来源:https://blog.csdn.net/gushidefengzheng/article/details/78653921

一. 什么是类装载器?

每一个Java虚拟机都由一个类加载器子系统,负责加载程序中的类型(类和接口),并赋予唯一的名字

二. JVM内存如何划分?

JVM中的内存主要划分为5个区域,即方法区,堆内存,程序计数器,虚拟机栈以及本地方法栈

  1. 方法区:方法区是一个线程之间共享的区域。主要用于存储已被虚拟机加载的类信息、常量,静态变量以及被编译器编译后的代码,也可以称为“永久代”,垃圾回收效果一般,通过-XX:MaxPermSize控制上限。

JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”
永久代: JDK1.8 中不存在永久代的概念了,取而代之的是 Metaspace(元空间)。移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。

  1. 堆内存:堆内存是垃圾回收的主要场所,也是线程之间共享的区域,主要用来存储创建的对象实例,通过-Xmx 和-Xms 可以控制大小。

创建的对象实例: 将int看成一个类,变量abc看成int的对象,声明变量的过程就叫实例化。

  1. 虚拟机栈(栈内存)为虚拟机执行Java方法每一个线程都有一个虚拟机栈,栈内存中主要保存局部变量、基本数据类型变量以及堆内存中某个对象的引用变量。每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。栈中的栈帧随着方法的进入和退出有条不紊的执行着出栈和入栈的操作。
  2. 本地方法栈: 本地方法栈的功能和特点类似于虚拟机栈,主要是为JVM提供使用native 方法的服务。

Native Method就是一个java调用非java代码的接口

  1. 程序计数器: 程序计数器是当前线程执行的字节码的位置(行号)指示器。在多线程情况下,为了线程切换后能够回到正常的执行位置,每个线程都要有一个行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,是内存区域中唯一一个在虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
三. 什么是执行引擎?
  • 执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致:
    输入:字节码文件
    处理:字节码解析
    输出:执行结果。

【题目拓展】

  • 什么是垃圾回收机制?
    释放垃圾占用的空间,防止内存泄露。
  • 什么是内存泄漏?
    内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
  • 什么是年轻代,老年代,永久代
    https://www.cnblogs.com/jichi/p/12580906.html

你可能感兴趣的:(Java常见问题,java,栈)