Java虚拟机之内存结构

在面试中通常会问到关于Java虚拟机的内容,重点在类机载机制、运行时数据区、GC垃圾回收,JVM性能调优等,本文主要是对JVM的内存结构进行描述;在对运行时数据区描述时,要注意以下两点:1.各个部分的功能;2.哪些是线程共享,哪些是线程独占
在这里插入图片描述
(图片来自网友博客)

  • CLASS LOADER(类加载器):把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型;

  • RUNTIME DATA AREA(运行时数据区):就是常说的JVM管理的内存区域

    • 线程共享区

      • 方法区(JDK 1.8将方法去移动到了直接内存,叫元空间[Metaspace])

      也叫永久区;存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码、运行时常量池等数据;

      • Java堆

        存放实例对象和数组对象;是垃圾回收的主要区域,由于现在收集器基本采用的分代垃圾收集算法,所以Java堆还可以细分成新生代和老年代;Java堆在物理上可以不连续,但在逻辑上必须连续;在堆上分配内存的方法有:指针碰撞(堆内存规整[是否规整,由垃圾回收器是否压缩整理决定]的情况下,所有用过和空闲的内存中间有明确的分界线)和空闲列表(用空闲列表来记录内存的使用情况);Java堆空间不足会抛出OutOfMemoryError

    • 线程独占区(这3个区域随线程而生,随线程而灭,对于内存分配和回收具有确定性,所以不需要考虑回收的问题)

      • 虚拟机栈:Java方法运行的内存模型,线程私有,生命周期与线程相同;每个方法被执行的时候都会常见一个栈桢(Stack Frame)用于存储局部变量表、操作数栈、动态链接和方法出口等信息; 方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程;栈里面存放着各种基本数据类型和对象的引用; StackOverflowError(线程请求的栈深度大于JVM所允许的深度);OutOfMemoryError(如果虚拟机栈可以动态扩展,但扩展时无法申请到足够的内存)。
      • 本地方法栈: 本地方法栈保存的是native方法的信息,当一个JVM创建的线程调用native方法后,JVM不再为其在虚拟机栈中创建栈帧,JVM只是简单地动态链接并直接调用native方法; 。
      • 程序计数器:记录当前线程所执行到的字节码的行号,记录下一条要运行的指令,每个线程都有一个程序计数器,是唯一一个没有OutOfMemoryError情况的区域
  • EXECUTION ENGINE(执行引擎):用于执行命令,不同的JVM内部实现不同,执行引擎在执行Java代码的时候有可能有解释执行和编译执行;

  • NATIVE INTERFACE(本地库接口):与本地库交互,调用native方法;当调用native方法时,就进入一个全新的并且不再受JVM限制的世界,很容易出现native OutOfMemory。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值