1、Java虚拟机运行时的数据区域,如下图所示。
(1) 程序计数器
每个线程都有一个独立的程序计数器,该内存区域不会出现OutOfMemoryError。
(2) Java虚拟机栈
线程私有,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表存放了编译期可知的各种基本数据(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型。局部变量表也就是人们常说的栈内存(Stack)。
(3) Java堆
所有线程共享,Java虚拟机启动时创建,通常是Java虚拟机所管理的内存中最大的一块。Java虚拟机规范说:所有的对象实例以及数据都要在堆上分配(栈上分配、标量替换等优化技术例外)。
线程共享的java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。
Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。
Java堆还可以细分为新生代和老年代。
(4) 方法区
线程共享,用于存储已被机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 方法区也被称为“永久代”,垃圾收集行为在这个区域也比较少。
运行时常量池(Runtime Constant Pool)也是方法区的一部分。
(5) 直接内存(Direct Memory)
直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但仍然会出现导致OutOfMemoryError出现(如忽略掉直接内存,导致各个内存区域的总和大于物理内存限制)
2、对象访问举例
Object obj = new Object();
“Object obj”这部分语义将会反映到Java栈的本地变量表中,作为一个reference类型数据出现。而“new Object()”这部分的语义将会反映到java堆中,形成一块存储了Object类型所有实例数据值(Instance Data,对象中各个实例字段的数据)的结构化内存。另外,在java堆中还必须包含能查到此对象类型数据(如对象类型、父类、实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。
相关推荐
java 虚拟机
深入理解Java虚拟机学习笔记借鉴.pdf
《深入Java虚拟机(原书第2版)》,原书名《Inside the Java Virtual Machine,Second Edition》,作者:【美】Bill Venners,翻译:曹晓钢、蒋靖,出版社:机械工业出版社,ISBN:7111128052,出版日期:2003 年 9 ...
这是自己读《深入理解Java虚拟机》时候用XMind建立的思维导图,目的是为了能够帮助自己整理、梳理相关的知识以及方便自己日后的回顾,帮助自己建立起关于JVM的知识体系,里边也有一些对相关内容的补充,通过备注的...
深入理解Java虚拟机笔记(带目录).docx
深入理解Java虚拟机(第二版)
long果 深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)。讲解相当详细,值得一看。下载仅供参考学习,侵权联删。
深入理解java虚拟机视频教程,jvm原理,java虚拟机,jvm性能调优,内存模型,gc工作原理,内存分配,类的加载等等视频教程
深入JAVA虚拟机 第二版,比较老的一本书,不那么完美但不影响观看,稍微有点倾斜
30+个视频+深入理解Java虚拟机(jvm优化+内存模型+虚拟机原理)
前言Java是目前用户最多、使用范围最广的软件开发技术之一。Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java API、Ja
包括jvm 的内存模型 对象的创建过程 垃圾回收算法 垃圾回收器 内存分配和回收策略
自己看《深入理解Java虚拟机》(第二版)所做的一些笔记。因为个人水平有限,能够理解的也只有前面几章的内容,后面的内容觉得看了也不是很理解,就没有记在里面。希望能对大家有所帮助,也希望能和大家一起进步。
诸葛_BAT面试之深入理解Java虚拟机_9
java虚拟机不用多少了吧。 深入java虚拟机第二版.pdf
深入理解JAVA虚拟机.xmind
了解jvm的pdf,高清pdf,希望大家下载
深入Java虚拟机——本地方法栈.pdf
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种...Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
深入JAVA虚拟机是中文的,但是内容是图片