Java内存区域的划分和异常
Java内存区域的划分和异常
运行时数据区域
JVM在运行Java程序时候会将内存划分为若干个不同的数据区域。
程序计数器
线程私有。可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通过改变这个计数值来读取下一条要执行的字节码指令。
多线程是通过线程轮流切换并分配处理器执行时间来实现的,任何一个时刻,一个内核只能执行一条线程中的指令。为了线程切换后能恢复到正确的执行位置,每条线程都需要一个独立的程序计数器。这就是一开始说的“线程私有”。如果线程正在执行的方法是Java方法,计数器记录的是虚拟机字节码的指令地址;如果是Native方法,计数器值为空。程序计数器是唯一一个在Java虚拟机规范中没有规定OOM(OutOfMemoryError)情况的区域。
Java虚拟机栈
线程私有,生命周期和线程相同。Java虚拟机栈描述的是Java方法的内存模型:每个方法在执行时都会创建一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口信息,每一个方法从调用到结束,就对应这一个栈帧在虚拟机栈中的进栈和出栈过程。局部变量表保存了各种基本数据类型(int、double、char、byte等
)、对象引用(不是对象本身)和returnAddress类型(指向了一条字节码地址)。
这部分区域可能发生两种异常:
线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError;
虚拟机栈扩展时无法申请到足够的内存,抛出OutOfMemoryError。
本地方法栈
上述虚拟机栈为JVM执行Java方法服务,本地方法则为执行Native服务。其他和虚拟机栈类似,也会抛出StackOverflowError、OutOfMemoryError。
Java堆
常说的“栈内存”、“堆内存”,其中前者指的是虚拟机栈,后者说的就是Java堆了。Java堆是被线程共享的。在虚拟机启动时被创建。
Java堆的作用是存放对象实例,Java堆可以处于物理上不连续的内存空间中,只要求逻辑上连续即可。
方法区
线程共享的区域。存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。方法区无法满足内存分配需求时,抛出OutOfMemoryError。
运行时常量池
运行时常量池是方法区的一部分。C用于存放编译期生成的各种字面常量和符号引用,将在类加载后进入方法区的运行时常量池中存放。Java语言不要求常量只能在编译期产生,换言之,在运行期间也能将新的常量放入。
直接内存
直接内存不属于虚拟机运行时数据区的一部分,也不是内存区域。本机直接内存的分配不会受到Java堆的大小限制,但终究是内存,如果各个内存区域总和大于物理内存限制,还是会出现OutOfMemoryError。
对象的创建过程
虚拟机遇到一条"new"指令:
首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用;
检查这个符号引用代表的类是否已被加载、解析、初始化;(如果没有,则必须先进行类的加载)
在Java堆中为新对象分配内存,所需大小在类加载后就确定了;
将分配到的内存空间都初始化为0(不包括对象头)
类的初始化,即init方法,吧对象按照程序员的意愿初始化为想要的值。
对象的内存布局
对象在内存中存储的布局可以分为3块区域:
对象头
实例数据
对齐补充
对象头:存储对象自身的运行时数据,比如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等。另外还有一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过该指针来确定这个对象属于哪个类的实例。
实例数据:对象真正有效的信息,在程序中定义的各种类型的字段内容;
对齐补充:非必须,占用符的作用。
对象的访问定位
Java程序通过栈上的引用来操作堆上的实例对象。比如
Person p = new Person();
这里p就是引用,new出来的Person对象是实例。
这个引用没有规定要如何定位、访问堆中的对象具体位置。主流的有两中访问方式:
句柄。Java堆中会划分出一块内存作为句柄池,引用存储了对象的句柄地址,而句柄中包含了对象实例数据和类型数据。好处是,对象被移动时,只需改变句柄中的地址,引用本身无需修改。
直接指针。引用中存储的直接就是对象地址。好处是速度更快,由于引用直接表示实例对象的地址,节省了一次指针定位操作。Sun HotSpot使用的正是这种方式。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-06/152788.html
转自:http://t.pae.baidu.com/s?s=bai-fz0t23
Java内存区域的划分和异常的更多相关文章
- Java虚拟机--Java内存区域的划分和异常
Java内存区域的划分和异常 运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 程序计数器 线程私有.可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通 ...
- 【java基础 7】java内存区域分析及常见异常
本篇博客,主要是读书笔记总结,还有就是结合培训分享的总结,没有太多的技术含量! java 的自动内存管理机制,使得程序员不用为每一个new惭怍的对象写配对的delete/ free代码(回想起C++的 ...
- java内存区域的划分
前言 之前我们探讨过一个.class文件是如何被加载到jvm中的.但是jvm内又是如何划分内存的呢?这个内被加载到了那一块内存中?jvm内存划分也是面试当中必被问到的一个面试题. 什么是JVM内存区域 ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
- JVM高级特性与实践(一):Java内存区域 与 内存溢出异常
套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...
- 第二章Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 一.概述 对与Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个new操作去写delete/free代码,不容易出现内存泄露和内存溢出问 题, ...
- 虚拟机--第二章java内存区域与内存溢出异常--(抄书)
这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...
- 【转】Java内存管理:深入Java内存区域
转自:http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html 本文引用自:深入理解Java虚拟机的第2章内容 Java与C++之间有一 ...
随机推荐
- mysql5.7.24启动报错:ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.
报错原因是:密码过期.不管你是刚刚修改密码还是什么,只要登陆都是有问题的,都是报这样子的错误. 解决方法是: 1.修改/etc/my.cnf文件,在[mysqld]下加入“skip-grant-tab ...
- yum 私有仓库
参考地址:https://blog.oldboyedu.com/autodeploy-yum YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具 ...
- 移动端真机调试抓包,fiddler web debugger
小白一枚,在公司大神指导下加之找了好多资料才勉强将fiddler的使用摸透,果然很好用. 一.设置手机 二.设置fiddler
- java使用elasticsearch进行模糊查询之must使用-项目中实际使用
java使用elasticsearch进行多个条件模糊查询 文章说明: 1.本篇文章,本人会从java连接elasticsearch到查询结果生成并映射到具体实体类(涵盖分页功能) 2.代码背景:el ...
- SDN 第四次作业
阅读 了解SDN控制器的发展 http://www.sdnlab.com/13306.html http://www.docin.com/p-1536626509.html 了解ryu控制器 http ...
- Vue.js实现前段评论展示
本来想着给这个博客弄个回复系统(类似知乎的回复),最初的实现思路是这样的:主评论后台渲染,前台新增的评论,回复用jquery操作dom放到页面上.实现的时候感觉好复杂,大量的dom操作,目前前段框架不 ...
- Codeforces Round #553 (Div. 2)B. Dima and a Bad XOR 思维构造+异或警告
题意: 给出一个矩阵n(<=500)*m(<=500)每一行任选一个数 异或在一起 求一个 异或在一起不为0 的每行的取值列号 思路: 异或的性质 交换律 x1^x2^x3==x3^x2 ...
- jq插件封装格式
(function($) { // closure $.fn.hilight = function( options ) { //将方法定义在$的fn上 var defaults = { textCo ...
- python获取文件扩展名的方法(转)
主要介绍了python获取文件扩展名的方法,涉及Python针对文件路径的相关操作技巧.具体实现方法如下: 1 2 3 4 import os.path def file_extension(path ...
- python高速排序
import random def rand(n): for i in range(n): yield random.randint(0,1000) #创建一个随机数列表 def createList ...