参考文献:深入理解Java虚拟机 周志明

《Ja

va虚拟机规范SE 7版》规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。如图:

程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器。在虚拟机的概念模式里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令的。在多线程程序中,为了能在线程切换后,能够恢复到正确的位置开始执行,每个线程都一个独立的程序计数器。如果该方法是Java方法,这个计数器记录的是JVM正在执行的字节码指令的地址;如果正在执行的方法是Native的,那么这个计数器的值是空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈

与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的。它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。(C++里,在函数调用时,先将调用函数的堆栈基址ebp入栈,再将调用函数的栈顶指针——esp的值赋给ebp作为被调用函数栈底基址,然后是函数的各个参数入栈,在大多数的C编译器中,参数是由右往左入栈的——目的是为了实现可变长参数,然后是函数中的局部变量。静态变量是不入栈的。被调用函数执行完成后,被调用函数的栈底即为调用函数的栈顶esp,然后再从恢复后的栈弹出原来压入的ebp的值,这样就能恢复调用函数原来的状态) JVM虚拟机栈的局部变量表存放了编译器可知的各种原始类型、对象引用、returnArress类型(指向了一条字节码指令的地址)。关于Java中栈帧的细节和帧架构指令集的执行过程将在以后的摘记中描述。

JVM stack 可以被实现成固定大小,也可以根据计算动态扩展。可以使用-Xss参数调整栈内存容量。

JVM Stack 异常情况:

StackOverflowError:线程请求的栈深度大于虚拟机所允许的最大深度。一般遇到的都是这种状况。

OutOfMemoryError:虚拟机在扩展栈时无法申请到足够的内存空间。

如果因为建立过多线程导致内存溢出,在不能减少线程数或者更换64位虚拟机的情况下,就只能通过减少最大堆和减少栈容量来换取更多的线程。

本地方法栈

本地方法栈(Native Method Stack)被虚拟机用来支持用到的Native方法。在虚拟机规范中对本地方法栈中方法使用的语言、使用方式与数据结构并没有强制规定。HotSpot直接把本地方法栈和虚拟机栈合二为一了。

异常情况:与虚拟机栈一样,也会抛出StackOverflowError和OutOfMemoryError异常。

Java堆

对于大多数应用,Java堆(heap)是被所有线程共享的一块内存区域。一般来说,堆是Java放置对象实例的主要区域。但是,随着JIT编译技术的发展,栈上分配和标量替换优化技术(需要逃逸分析技术的支持)也使这种分配方式变得不那么绝对了。Java堆是垃圾回收的主要区域(方法区也会回收一些不用的常量等)。Java堆可以细分为:新生代、老年代、永久代。堆中储存的对象被自动管理内存系统(Automatic Storage Management System,也即是常说的“Garbage Collector(垃圾回收器)”)所管理,所以Java程序员无需、也无法显示地销毁对象。Java堆的容量可以是固定大小,也可以随着需求动态扩展(通过-Xmx和-Xms控制)。Java堆所使用的内存不需要保证是物理连续的,只要逻辑上是连续的即可。

Java 堆异常:

OutOfMemoryError:如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,抛出异常。

方法区(Method Area)

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,被用来存储已被类加载子系统加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区的容量可以是固定大小的,也可以随着程序执行的需求动态扩展,并在不需要过多空间时自动收缩。方法区在实际内存空间中可以是不连续的。

Java 方法区异常:

OutOfMemoryError: 方法区的内存空间不能满足内存分配请求。

方法区溢出也是一种常见的内存溢出异常。在经常动态生成大量Class的应用中,需要特别注意类的回收状况。常见的情景有:大量JSP或动态产生JSP文件的应用、基于OSGi的应用等。

运行时常量池(Runtime Constant Pool)

运行时常量池是方法区的一部分。运行时常量池用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入运行时常量池中存放。

在扩展类和接口的运行时常量池时,可能会遇到的异常:

OutOfMemoryError:和方法区一样,也会抛出OutOfMemoryError异常。

直接内存(Direct Memory)

NIO引入了基于通道和缓冲区的I/O方式,它可以使用Native函数分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。

java 内存 min_Java内存区域相关推荐

  1. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  2. java 句柄 内存_Java内存区域学习

    运行时区域 Java虚拟机在执行Java程序过程中把其所管理的内存划分成若干个不同的数据区域. 程序计数器 当前线程所执行的字节码的指示器.通过改变这个计数器的值来选取下一个需要执行的字节码指令,分支 ...

  3. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  4. 深入理解java虚拟机一 JAVA运行时内存区域与class文件

    一 JAVA运行时内存区域 JVM在加载class文件时,会将class文件定义的数据结构转为运行时内存中的数据,那么jvm是如何安排运行时的内存区域呢? jvm将运行时内存划分为以下几个部分: 堆: ...

  5. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  6. 深入理解Java中的内存泄漏

    理解Java中的内存泄漏,我们首先要清楚Java中的内存区域分配问题和内存回收的问题本文将分为三大部分介绍这些内容. Java中的内存分配 Java中的内存区域主要分为线程共享的和线程私有的两大区域: ...

  7. 形式参数内存在哪java_深入浅出Java中JVM内存管理

    原标题:深入浅出Java中JVM内存管理 Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗?可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义 | 有哪些GC ...

  8. java 什么是内存屏障,java内存屏障和可见性

    内存屏障 由于现代的操作系统都是多处理器.而每一个处理器都有自己的缓存,并且这些缓存并不是实时都与内存发生信息交换.这样就可能出现一个cpu上的缓存数据与另一个cpu上的缓存数据不一致的问题.而这样在 ...

  9. 深入浅出 Java 中 JVM 内存管理

    Java岗位面试,JVM是对程序员基本功考察,通常会问你对JVM了解吗? 可以分几部分回答这个问题,首先JVM内存划分 | JVM垃圾回收的含义  |  有哪些GC算法  以及年轻代和老年代各自特点等 ...

最新文章

  1. 微调Faster-R-CNN-InceptionV2完成高准确率安全帽检测任务
  2. 2.9 logistic 回归中的梯度下降法
  3. 【java】DecimalFormat与JTextArea的区别
  4. R语言之高级数据分析「聚类分析」
  5. 西电计科《算法分析与设计》上机(源码+实验报告+历次作业)(渗透问题+排序算法性能比较+地图路由+文本索引)(2019级 霍红卫老师)
  6. 网络七层协议的形象说明
  7. 让你精力充沛的25个简单方法
  8. 两套php代码使用同一个数据库,php开发公用同一个数据库
  9. Spring常见问题解决 - Required request body is missing
  10. Detecting Spacecraft Anomalies Using LSTMs and Nonparametric Dynamic Thresholding
  11. 旋转矩阵和角速度之间的关系
  12. AnyTrans for Mac(ios数据传输工具)
  13. 向前的快捷键_快速提高逼格的电脑快捷键你懂多少?
  14. python中 a or b 的值为_若a=1, b=2,那么(a or b)的值为( )。 (2.0分)_学小易找答案...
  15. matlab 中图的大小_关于matlab绘图中字体及图片大小等的设置
  16. matlab 龙贝格法,matlab龙贝格法
  17. (五)carla中世界坐标系与相机坐标系、像素坐标系变换
  18. continue 的用法详解
  19. L5W2作业2 词向量的基本操作
  20. ASP.NET 入门

热门文章

  1. bzoj 2437: [Noi2011]兔兔与蛋蛋
  2. 【Android】Android实现自定义带文字和图片的Button
  3. python 十六进制打印编码
  4. .Net程序集强签名详解
  5. ecshop始终显示全部分类
  6. ELK Stack 日志平台性能优化实践
  7. 企业实战|企业FTP搭建
  8. VBA中让程序休眠 SLeep的方法
  9. java语言中application异常退出和线程异常崩溃的捕获方法,并且在捕获的钩子方法中进行异常处理
  10. ajax的content-download时间过慢问题的解决与思考