Java JVM 内存空间解析
运行时数据区:
运行时数据区主要分五块,分别是Method Area , VM Stack , Native Method Stack ,
Heap , program Counter Register。
Program Counter Register :
程序计数器是一小块内存空间,可以看作是当前线程所执行字节码的行号指示器。字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,各类基础功能也都是要依赖这个计数器来实现。
Java虚拟机的多线程是通过线程之间轮流切换并分配处理器的执行时间来实现的。也就是说,任何一个确定的时刻,一个处理器都只执行一个线程。因此为了保证线程切换的正确,每一个线程都有一个程序计数器,各个计数器互相不影响,独立存储。(线程私有内存)
如果线程在执行的是Java方法,那么程序计数器指向正在执行的字节码指令地址;如果一个线程执行的是Native方法,计数器值为空(Undefined)。
Java virtual Machine Stack:
和程序计数器一样,Java虚拟机栈也是线程私有的。它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型:
每个方法在执行的同时都会创建一个Stack Frame 用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法从调用直到执行完成的过程,就对应着一个Stack Frame在虚拟机栈中入栈出栈的过程。
许多java程序员口中的栈,指的就是虚拟机栈的局部变量表。局部变量表存放了编译期可知的各种数据类型,包括8种基本类型和对象引用。
Reference类型:它不等同与对象本身,可能是一个指向对象起始地址的指针,也可能是指向一个对象的句柄(二级指针)或与此对象相关的位置,还有可能指向一条字节码指令的地址。
一个局部变量空间占32位,局部变量表在编译期完成分配。当进入一个方法时,这个方法需要在Stack Frame 中分配多大的局部变量空间是已经确定了的,此后大小也不会变化。
Java虚拟机规范中定义了两种异常:
1 )StackOverflowError :线程请求的栈深度大于虚拟机所允许的深度。(递归调用)
2)OutOfMemoryError : 大部分的虚拟机都支持空间的动态扩展,而如果扩展时无
法申请到足够的内存,就会抛出此异常。
Native Method Stack
本地方法栈与虚拟机栈的区别就是,虚拟机栈为执行Java字节码服务,本地方法栈为虚拟机使用到的Native方法服务。
虚拟机规范并没有对本地方法栈做使用方式和数据类型的强制规定,所以具体的虚拟机可以自由实现它。
Java Heap
Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存的唯一目的就是存放对象的实例,几乎所有的对象实例(包括数组)都放在这里分配内存。
Java堆可以处于物理上的不连续的空间(逻辑空间连续即可),实现时,既可以固定大小,也可以是可扩展的。
当堆中没有内存完成实例分配,并且堆也无法扩展时,会抛出OutOfMemoryError。
Method Area
Method Area和堆一样是各个线程共享的内存区域。它用于存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
Method Area 也叫Non-Heap,很多人更愿意把它称为Permanent Generation(永生代),事实上,有的虚拟机设计者选择吧GC分代收集扩展到方法区,或者说使用永生代实现方法区,这样JavaGC就可以像管理Heap一样管理MethodArea,省去了专门为MethodArea专门写GC的麻烦。而永生代实现方法区并不是一个好主意,因为更容易出现内存溢出。现在逐渐开始采用Native Memory来实现方法区。
Runtime Constant Pool
运行时常量池是方法区的一部分。Class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是Constant Pool Table(常量池)用于存放编译期生成的各种字面量和符号引用。Constant Pool Table 将会在类加载后进入方法区的运行时常量池中存放。
Runtime Constant Pool 相对于Class 文件常量池的一个重要特征就是具备动态性。Java中常量并不是只有在编译期才能产生,也就是并非只有置入Class常量池中的内容才能进入方法区的运行时常量池,运行期间也可以将新的常量放入池中。这种特性被利用的比较多的就是String的intern()方法。
Direct Memory
Direct Memory不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存。但这并非内存也被频繁使用,而且可能导致OutOfMemoryError。
直接内存不会受堆大小的限制。由于经常忽略直接内存,所以经常在动态扩展时导致出现OutOfMemoryError异常。
Java JVM 内存空间解析的更多相关文章
- Java JVM 内存泄漏--全解析和处理办法 [ 转载 ]
Java JVM 内存泄露——全解析和处理办法 [转载] @author 小筐子 @address http://www.jianshu.com/p/bf159a9c391a JA ...
- JVM内存区域解析
引言 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的 ...
- 深入探究JVM(1) - Java的内存区域解析
http://blog.csdn.net/sczyh22/article/details/46652901<br>Java 虚拟机在执行Java程序的时候会把它管理的内存区域划为几部分,这 ...
- [ 转载 ] Java Jvm内存介绍
一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...
- java jvm内存管理/gc策略/参数设置
1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...
- Java jvm 内存回收机制
http://blog.csdn.net/yaerfeng/article/details/51291903 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这两方 ...
- JVM内存结构解析
月初的时候个人网站到期了,不想再折腾重新建站了,以后还是来第三方博客写文章吧,可以省去很多问题.之前写的文章也不是很多,备份懒得做了,从头开始吧.博文仅仅是用来记录和学习总结,如有错误之处请帮忙指正! ...
- JVM内存空间划分与作用详解
在之前已经对Java的字节码进行了非常详细而又系统的学习了,接下来开启jvm内存相关的新篇章,在一个新知识开头之前肯定得理论化的对其进行一个整体的介绍,所以摒弃浮躁,先来看看相关的理论,主要是看一下J ...
- 全网最硬核 Java 新内存模型解析与实验单篇版(不断更新QA中)
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
随机推荐
- spring ajax以及页面返回中文乱码问题解决
在spring配置文件中添加 <!--返回中文乱码--> <mvc:annotation-driven > <!-- 消息转换器 --> <mvc:messa ...
- [AngularJS] $location 服务简介
参考博客: https://www.cnblogs.com/gaoruixin/p/6070502.html 简介 $location服务解析在浏览器地址栏中的URL(基于window.locati ...
- MySQL-5.6.30 (OpenLogic CentOS7.2)
平台: CentOS 类型: 虚拟机镜像 软件包: centos7.2 mysql5.6.30 basic software database linux open source 服务优惠价: 按服务 ...
- 腾讯云服务器CVM购买详细过程 选择我们需要的腾讯云服务器
腾讯云服务商有云服务器.云数据库.CDN.云存储等产品,其中较多的用户会选择腾讯云服务器,因为用途比较广泛,比如用来软件的运行以及网站建设,如今一般都是用云服务器,而不是用虚拟主机,毕竟虚拟主机的性价 ...
- win10蓝牙添加设备无法连接
解决方法: 打开运行窗口,输入services.msc. 找到蓝牙支持服务(或者Bluetooth Support Service),右键,属性,启动类型选择手动,启动服务. 还不行的话,此电脑右键, ...
- java Vamei快速教程10 接口的继承和抽象类
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在实施接口中,我们利用interface语法,将interface从类定义中独立出 ...
- 【BZOJ4866】[YNOI2017] 由乃的商场之旅(莫队)
点此看题面 大致题意: 给你一个字符串,每次给你一段区间,问这段区间内有多少个字符串在重新排列后可以变成一个回文串. 关于莫队 详见这篇博客:莫队算法学习笔记(一)--普通莫队. 关于回文 要使一个字 ...
- Web/Java Web项目如何模块化?没有正文,别点
事情是这样的,两三年前做了几个Java Web项目,由于薪资原因,原主程都离开了. 由于公司不规范,也没有留下正规的开发文档,只有一个源程序在手里.后面的很多系统维护都很被动. 领导就觉得说,这样不好 ...
- package.json字段分析
分析1.必须在包的顶层目录下2.二进制文件应该在bin目录下3.javascipt在lib目录下4.文档在doc目录下 package.json字段分析 name:包的名称,必须是唯一的,由小写英文字 ...
- webSocket使用心跳包实现断线重连
首先new一个webscoket的连接 let noticeSocketLink = new WebSocket(‘webSocket的地址’) 这里是连接成功之后的操作 linkNoticeWebs ...