自动内存管理机制-运行时数据区

  java运行时数据区域分为:1. 程序计数器:程序计数器占据的内存空间较小,是当前运行线程执行的字节码的计数;分支、循环、跳转、异常处理、线程恢复等都要依赖技术器来对执行的字节码进行执行位置的计算来实现的。程序计数器的内存空间是每条线程独有的,也称之为“线程私有”的内存;计数器记录的是正在运行的字节码指令的地址,而如果是Native方法(本地方法),则计数器的值为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

  2. java虚拟机栈:java虚拟机栈也是线程私有的,它的生命周期与线程相同。每个方法在运行的时候都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法的调用,就对应着一个栈帧在虚拟机栈种从入栈到出栈的过程。局部变量表中存储了编译期可知的各种基本数据类型,(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型)和returnAddress类型。java虚拟机栈会抛出StackOverflowError异常和OutOfMemoryError异常。

  3.本地方法栈:本地方法栈是本地方法的“java虚拟机栈”。

  4.Java堆:Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”;根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,当前主流的虚拟机都是按照可扩展实现的(当然可以是固定的),通过-Xmx和-Xms控制。当没有内存可以完成对象的实例的分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

  5.方法区:方法区也是被线程共享的,它存储的是:被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java堆区分开来。

对于Java堆从内存回收的角度来看,Java堆可以分为新生代和和老年代;很多人愿意把方法区称为“永久代”(限于HotSpot虚拟机);根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

  6.运行时常量池:时方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。因为运行期间也可能会因为String类的intern()方法来将新的常量放入池中,所以当常量池无法再申请到内存时会抛出OutOfMemoryError异常。

原文地址:https://www.cnblogs.com/blogs423524123/p/9495893.html

时间: 2024-10-05 05:04:39

自动内存管理机制-运行时数据区的相关文章

java内存管理机制(一)-运行时数据区

前言 本打算花一篇文章来聊聊JVM内存管理机制,结果发现越扯越多,于是分了三遍文章(文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8),本文为其中第一篇.from java内存管理机制(一)-运行时数据区  1. java内存管理机制-运行时数据区 2. java内存管理机制-内存分配 3. java内存管理机制-垃圾回收 正文 C++与java之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙里的人却想出来…… 与C.C++程序员时刻要关注着内存的分配与释放

深入JAVA虚拟机之运行时数据区

前言最近在啃一本书<深入JAVA虚拟机>,这本书不是第一次看,可以说是从大学就开始看,这一次应该算第三次啃这本书,也应该说算是第一次真正啃这本书.大学的时候,只是好奇表层的一些神奇现象,随着工作几年后,现在回过头来再次啃这本书,对于表层的那些以前觉得神奇的现在已经感觉乏味,反而对于底层是如何实现.如何运作的越来越着迷.这也是这次看这本书的初衷.通过写博客记录下自己的学习过程,也方便以后回头看看现在的看法想法在将来会变成怎样.如果我在下面的文字表述上或者理解上有误解或者错误,请各位大神能够留言指

jvm特性与原理----------&gt;jvm运行时数据区分区

1.概述: 内存分区:JVM会把自己所管理的所有内存区域进行分区. 各个区域的服务对象 各个区域中分别存放了什么内容 存放的数据是如何创建的 这些数据在各个区域中存放,存储的布局是什么样的 如何访问存放在不同内存区域的数据 各个区域的创建和销毁时间 随着进程的启动和结束而创建和销毁 随着线程的启动和结束而创建和销毁 各个区域服务过程中可能产生的问题(异常) 各个区域中可能产生的异常 如何解决上述各种异常 2.JVM内存分区 3.JVM内存各个区域的比较   JVM内存分区(JVM运行时数据区)

JVM系列之四:运行时数据区

1. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 2. JDK1.7内存模型-运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存如下图所示. 1-3为线程私有,4-5为线程共享 1.程序计数器:为了线程切换后能恢复到正确的执行位置.线程私有2.Java虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:方法被调用时创建栈帧-->局部变量表->局部变量.对象

深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)

了解Java GC机制,必须先清楚在JVM中内存区域的划分. JVM的体系结构如下:JVM的类加载系统.执行引擎系统.垃圾回收器都是去访问  运行时数据区. JVM管理的内存区域分为几个模块: (未完待续...)

Java内存模型与JVM运行时数据区的区别

首先,这两者是完全不同的概念,绝对不能混为一谈. 1.什么是Java内存模型? Java内存模型是Java语言在多线程并发情况下对于共享变量读写(实际是共享变量对应的内存操作)的规范,主要是为了解决多线程可见性.原子性的问题,解决共享变量的多线程操作冲突问题. 多线程编程的普遍问题是: 所见非所得 无法肉眼检测程序的准确性 不同的运行平台表现不同 错误很难复现 故JVM规范规定了Java虚拟机对多线程内存操作的一些规则,主要集中体现在volatile和synchronized这两个关键字. vo

JVM内存结构——运行时数据区

在Java虚拟机规范中将Java运行时数据划分为6种,分别为: PC寄存器(程序计数器) Java栈 堆 方法区 运行时常量池 本地方法栈 一.PC寄存器(程序计数器) PC寄存器(Program Counter Register)严格来说是一个数据结构,它用于保存当前正常执行的程序的内存地址. 线程私有. 每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器.PC寄存器里保存有当前正在执行的JVM指令的地址. 每个线程都需要一个独立的程序计数器,各条线程之间

jvm内存模型(运行时数据区)

运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独立的运行时数据区 线程间独立的区域随线程的创建而创建,随线程销毁而销毁.线程独立的区域内存储的数据只有该线程能够访问,对其他线程是不可见的. 程序计数器寄存器(pc Register) 每个线程都有自己的pc(程序计数器)register(寄存器).在任意时点上,jvm中的线程只能执行一个类的一个方

JVM内存结构(运行时数据区)

前言 Java程序的运行是通过Java虚拟机来实现的.通过类加载器将class字节码文件加载进JVM,然后根据预定的规则执行.Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些内存区域被统一叫做运行时数据区.Java运行时数据区大致可以划分为5个部分.在这里要特别指出,我们现在说的JVM内存划分是概念模型.如下图所示: JVM运行时数据区分为5种: 程序计数器 虚拟机栈(java栈) 堆 方法区 本地方法栈 程序计数器 程序计数器是一块较小的内存空间,它可