java虚拟机运行时数据区域
1、程序计数器;是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。
由于Java虚拟机的多线程是通过线程轮流切换并分配执行处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程中的指令。因些,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,为
线程私有的内存。
此内存是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。
2、java虚拟机栈;也是
线程私有,它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机中入栈到出栈的过程。
局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。
java虚拟机规范中,这个区域规定了两种异常状况:(1)如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;(2)如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError.
3、本地方法栈;虚拟机栈为Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。同样有StackOverflowError异常和OutOfMemoryError。
4、Java堆;被
所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
从内存回收的角度来看,由于现在收集器基本采用分代收集算法,所以java堆中还可以细分为:新生代和老年代;
java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。在实现时,既可以实现固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。
5、方法区;是各个
线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在java虚拟机规范中把其描述为堆的一个逻辑部分。
对于习惯在Hotspot虚拟机上开发、部署的开发者来说,很多人更愿意把其称为“永久代”,本质上两者并不等价,仅仅是因为Hotspot虚拟机的设计团队选择把GC分代收集器可以像管理java堆一样管理这部分内存,能够省去专门为方法区编写内存管理的代码工作。对于其它虚拟机(发BEA JRockit、IBM J9等)来说不存在永久代的概念。使用永久代来实现方法区,这样更容易遇到内存溢出问题。因此,对于Hotspot虚拟机,根据官方发布的路线图信息,现在也用放弃永久代并逐步改为采用Native Memory来实现方法区的规划了,在目前已发布的JDK 1.7的HotSpot中,已经把原本放在永久代的字符串常量池移出。
其不需要连续的内存和可以选择固定大小或者可扩展久,还可以选择不实现垃圾收集。当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。
6、运行时常量池;其是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。
7、直接内存;并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。但是这部分内存也被频繁地使用,而且也可以导致OutOfMemoryError异常出现。
- 大小: 119.5 KB
分享到:
相关推荐
深入理解Java虚拟机-Java内存区域透彻分析(序列化、反序列化概念及其使用场景+实现序列化的方式+transient关键字)
1. JVM调优 1.1 JVM调优总结(一)-一些概念 1.2 JVM调优总结(二)-一些概念 1.3 JVM调优总结(三)-基本...4.1 JVM内存管理:深入Java内存区域与OOM 4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM
第23节Java内存区域-Java虚拟机栈00:12:04分钟 | 第24节Java内存区域-程序计数器00:12:54分钟 | 第25节Java内存区域-本地方法栈00:02:39分钟 | 第26节Java内存区域-堆内存00:05:08分钟 | 第27节Java内存区域-...
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
第23讲 Java内存区域-Java虚拟机栈 00:12:04 第24讲 Java内存区域-程序计数器 00:12:54 第25讲 Java内存区域-本地方法栈 00:02:39 第26讲 Java内存区域-堆内存 00:05:08 第27讲 Java内存区域-方法区 ...
本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...
垃圾回收重点区域:堆和方法区部分区域。 引用计数算法: 1,引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1;任何时刻计数器都为0的对象是...
第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot...
刚开始看《深入理解Java虚拟机》,文章主要就当笔记来用了,整理知识点,方便以后复习查看 Java 虚拟机内存划分 运行时数据区域 执行 Java 程序的过程中,把它所管理的内存划分为若干个不同的数据区域。 这些区域都...
java虚拟机在程序运行时将内存划分为多个区域,每个区域作用,生命周期各不相同,下面这篇文章主要给大家介绍了关于java虚拟机深入学习之内存管理机制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以...
第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...
在讨论JVM内存区域分析之前,先来看一下Java程序具体执行的过程: Java程序执行过程 Java 程序的执行过程:Java 源代码文件(.Java文件)-> Java Compiler(Java编译器)->Java 字节码文件(.class文件...
本文为java虚拟机内存模型概述,参考了《深入了解java虚拟机》与几篇博客整合而成。
主要关于java虚拟机的运行时数据区域,参考了周志明的深入理解java虚拟机,还涉及到了native方法、垃圾回收机制等等。
Java 虚拟机面试题全面解析,《深入理解Java虚拟机》干货版,自己总结,希望能够帮助大家,免费下载~什么是类加载机制? 虚拟机和物理机的区别是什么? 运行时栈帧结构 Java方法调用 什么是方法调用? Java的方法调用,...
笔记,1、虚拟机的前世今生,深入理解JVM内存区域1
按照官方的说法:Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。 JVM主要管理两种类型内存:堆和非堆,堆内存(HeapMemory)是在Java虚拟机启动时创建,非堆内存(Non-heap ...
JVM的重要性不言而喻,这个是学习JVM是看视频和读《深入理解JVM》时做的一些笔记,用于复习参考。 读书笔记 第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有...
引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些... 首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域,这几个区域在java类的生命周期中扮演着比较重要的角色: 方法区:在
Java内存区域划分与对象新建过程 jvm垃圾收集机制与内存分配策略 jvm类加载机制 Java的内存模型 锁优化 Think In Java Java容器 Java并发 Java Concurrency in Practice 对象的共享 对象的组合 基础构建模块 JavaGC...