Java虚拟机学习笔记(一)--运行时数据区域
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan
前言
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成若干个不同的数据区域。
程序计数器
- 是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器
- 程序计数器处于线程独占区,Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任一时刻,一个处理器只会执行一条线程中的指令,当线程切换后能够恢复到正确的执行位置,因此每个线程需要有一个独立的程序计数器
- 如果线程正在执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是native方法,这个计数器的值是undefined。这里的native方法就是一个java调用非java代码的接口。至于为什么要用?请参看《Java的native方法》
- 此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,因为程序计数器是Java虚拟机自己管理的区域,开发人员不需要去维护,因此,就没有规定任何OutOfMemoryError
Java虚拟机栈
- 线程私有,为虚拟机执行Java方法服务
- 描述Java方法执行的动态内存模型,每个方法执行时会创建一个栈帧,用来存放局部变量表,操作数栈,动态链接,方法出口,每一个方法从调用开始直到调用结束,都对应着入栈和出栈过程。
- 大小:方法调用时会不断的进栈,当超过栈大小时会报StackOverFlowError
- 如果虚拟机可以动态扩展,如果扩展时无法申请到足够的内存,则会报OutOfMemoryError异常
- 局部变量表:存放了编译期可知的各种基本数据类型,对象引用
本地方法栈
- 为虚拟机执行native方法服务
- 其它同java虚拟机栈
Java堆
- 线程共享
- 是Java虚拟机所管理的内存中最大的一块
- 存放对象
- Java堆,可处于物理上不连续的内存
- 既可以是固定大小的,也可以是可动态扩展的,若申请不到内存,则会报OutOfMemoryError异常
方法区
- 线程共享
- 虚拟机加载的类信息,常量,静态变量(类的版本,字段,方法,接口)
- 很少有垃圾回收
- 大小可固定也可动态分配,当申请不到足够的内存时,会报OutOfMemoryError异常
直接内存与运行时常量池
- 运行时常量池属于方法区一部分,受内存限制,当申请不到足够内存时会报OutOfMemoryError异常
- 运行时常量池用于存放编译期生成的各种字面量和符号引用
- 直接内存不是虚拟机运行时数据区的一部分,可以提高效率,避免了在Java堆和Native堆来回复制数据
- 直接内存受本机内存限制,因此会出现OutOfMemoryError异常
举个例子
public static void main(String[] args) {String s1 = "abc";String s2 = "abc";String s3 = new String("abc");System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s1 == s3.intern());}
s1和s2放在栈区,指向常量池中的abc引用,s3是new出的对象,所以放在堆中,当使用s3.intern()方法时,会将"abc"放到运行时常量池,当运行时常量池中已经存在时,就不再往运行时常量池中存放,而是直接指向引用!
Java虚拟机学习笔记(一)--运行时数据区域相关推荐
- JVM学习笔记② JVM运行时数据区域
JVM所管理的内存将会包括以下几个运行时数据区域: 方法区(Method Area) 方法区是各个线程共享的区域,存放类信息.常量.静态变量.即时编译器编译后的代码等数据.虽然Java虚拟机规范把方法 ...
- 《深入理解Java虚拟机》笔记01 -- 运行时数据区
运行时数据区示意图 1. 程序计数器 占用一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器.主要用来记录线程执行到哪条语句了,分支.循环.跳转.异常处理.线程恢复等功能都需要依赖这个 ...
- Java虚拟机管理的内存运行时数据区域解释
2019独角兽企业重金招聘Python工程师标准>>> 概述 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销 ...
- [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...
前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine ,既然是虚拟机, ...
- JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...
- Java虚拟机(四)——运行时数据区
运行时数据区 内部结构概述 内存概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略. ...
- 【JVM学习笔记】运行时数据区
一.运行时数据区与线程概述 1 运行时数据区的结构 其中方法区和堆是随着虚拟机的创建而创建摧毁而摧毁,为各个线程所共用.而程序计数器(PC).本地方法栈(NMS).虚拟机栈(VMS)则是随着某个线 ...
- java虚拟机之一内存运行时数据区域解释
Java虚拟机管理的内存运行时数据区域解释 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启 ...
- Java 虚拟机学习笔记 | 运行时数据区总结
前言 要想学习好 Java,Java虚拟(JVM)的学习是绕不开的.学习 Java虚拟(JVM)首先就要先了解的就是Java虚拟(JVM)运行时数据区. 在Java语言和虚拟机规范中对运行时数据区进行 ...
最新文章
- php 1 2 3 转arry_在PHP语言中使用JSON和将json还原成数组的方法
- 创建springboot_【小练习】创建SpringBoot程序
- 运维如何逆袭?月薪30K的牛逼运维需要的知识,全在这里了
- linux 解决依赖性错误,linux – 由于单模块依赖性,XSP配置失败
- VMware workstation 网络设置详解
- Chrome的vimium插件的使用笔记
- Android系统(274)---如何预置APK
- [spark程序]统计人口平均年龄(本地文件)(详细过程)
- ERROR:进行解析时遇到错误,找不到资源“$(string.VerMgmtAuditModeEnable)”
- VSCode编译Python环境搭建及发布Python应用
- 【计算机图形学】画线算法——中点画线算法
- AD14,原理图绘制引脚以及引脚名称的修改
- pyqt5和spyder版本对应_pyqt5 spyder 项目 记录
- 8种经典的统计学悖论18种经典的哲学悖论
- Excel 散点图和折线图的区别
- error: RPC failed; curl 55 OpenSSL SSL_write: SSL_ERROR_ZERO_RETURN, errno 10053
- OSS上传txt文件乱码问题
- 计算一幅图像的平均亮度
- 分析师:一季度特斯拉电动汽车产量和交付量将低于华尔街预期
- 以太坊钱ethereum wallet最新版本使用(0.11)