一、Java虚拟机内存划分

  1.程序计数器

  线程私有

  可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

  Java虚拟机是通过多线程轮流切换并分配处理器执行时间的方式实现,为了切换线程后能正确的恢复到执行的位置,每一个线程都有一个独立的程序计数器。

  2.Java虚拟机栈

  线程私有,与线程的生命周期相同。

  虚拟机栈描述的是Java方法执行的内存模型:每个方法创建的时候都要创建一个栈帧,用户存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法执行到结束标示一个栈帧的入栈到出栈。

  局部变量表:存放编译期可知的基本数据类型(boolean ,byte,char,short,int,float,long,double),对象引用,returnAddress类型。long,double占用两个空间(slot),其他类型占用一个。

  这个区域规定了两个异常:①线程请求的栈深度大于虚拟机允许的深度会抛出StackOverflowError,这种异常出现的场景最长现的是递归。简单说就是方法的层数太多。②虚拟机栈如果不能扩容,当方法太大的话,出现占用的内存太大出现OutOfMemoryError.

  3.本地方法栈

  与虚拟机栈发挥的作用相似,虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机使用的Native方法服务。

  4.Java堆

  Java堆是所有线程共享的一块内存区域,在虚拟机启动的时候创建。所有对象实例以及数组都要在堆上分配。

  如果堆中没有内存完成分配的时候,并且堆空间无法扩展的时候会出现OutOfMemoryError异常。

  5.方法区

  线程共享的内存区域,作用:存储已经被虚拟机加载的类信息、常量、静态变量、即时编译期编译后的代码等数据。

  会出现OutOfMemoryError异常

  6.运行时常量池

  运行时常量池是方法区的一部分。Class文件中存在:类的版本、字段、方法、接口等描述信息;还有常量池:用户存放编译期生成的各种字面量和符号引用,这部分将在类加载之后进入方法区的运行时常量池。

二、HotSpot虚拟机对象探秘

  1.对象的创建

  1.1 虚拟机遇到new时,首先检查这个指令的参数是否在常量池中定位到一个类的引用,并且这个引用代表的类是否被加载、解析和初始化过,如果没有则执行相应的类加载过程。

  1.2 虚拟机为对象分配内存

  对象所需的大小在类加载之后就能确定。两种方案:①指针碰撞:需要内存是绝对规整的,分配了的在一边,未分配的在另一边。中间存放指针作为分界点的指示器。②空闲列表:记录哪些内存是可用的。分配方案根据垃圾回收机制确定,有没有压缩整理机制。

  1.3 虚拟机将分配到的内存控件初始化为0.

  1.4虚拟机对对象进行必要的设置。

  例如:这个对象是哪个类的实例、如何才能找到类元数据信息、对象的哈希码、对象的GC分带年龄。这些信息存放在对象头之中。

  1.5 上面工作完成后从虚拟机角度,对象已经创建,但是所有字段都是0,接着执行<init>操作把对象按照程序员的意愿进行初始化

  2.对象的内存布局

  对象在内存中布局可以分为3个区域:对象头、实例数据、对齐填充

  2.1 对象头

  包括两部分:①存储对象自身的运行数据,如哈希码、GC分带年龄、锁状态标识、线程持有的锁、偏向线程ID、偏向时间戳。

  

  ②类型指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。

  2.2 实例数据:对象真正存储的有效信息。

  2.3对其部分:占位符。

  3.对象的访问定位:

  3.1句柄方式:

  

  3.2 直接指针:

  

三、OutOfMemoryError异常

  -Xss 128k (配置栈大小) -Xms -Xmx (配置堆大小,最大,最小)

  

  

  

  

Java 内存区域与内存溢出异常的更多相关文章

  1. 深入理解java虚拟机系列(一):java内存区域与内存溢出异常

    文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...

  2. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域  

  3. 深入了解Java虚拟机(1)java内存区域与内存溢出异常

    java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局 ...

  4. 深入理解java虚拟机---->java内存区域与内存溢出异常

    2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...

  5. 第二章Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 一.概述 对与Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个new操作去写delete/free代码,不容易出现内存泄露和内存溢出问 题, ...

  6. 2.1 自动内存管理机制--Java内存区域与内存溢出异常

    自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...

  7. 虚拟机--第二章java内存区域与内存溢出异常--(抄书)

    这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...

  8. 深入理解Java虚拟机之Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...

  9. 深入理解Java虚拟机之图解Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...

  10. JVM内存区域与内存溢出异常

    Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域,不同的区域在内存不足时会抛出不同的异常. >>运行时数据区域的划分 (1)程序计数器程序计数器(Progra ...

随机推荐

  1. mysql5.7.23版本环境配置

    亲身实践安装mysql,用时居然花费了三个小时,在有那么多教程的情况下,依然在不该花费时间的路上浪费了太多时间.希望这篇文章能够帮助大家少走弯路~~ 1.下载我下载的是64位. 2.解压下载之后,我选 ...

  2. POJ 1860: Currency Exchange 【SPFA】

    套汇问题,从源点做SPFA,如果有一个点入队次数大于v次(v表示点的个数)则图中存在负权回路,能够套汇,如果不存在负权回路,则判断下源点到自身的最长路是否大于自身,使用SPFA时松弛操作需要做调整 # ...

  3. 【gets getline的用法 char[]转化为str】poj 2418

    http://poj.org/problem?id=2418 [注意] 1. 输入有空格,用 char str[maxn]; while(gets(str)){ str[]!='\0'; } 或 st ...

  4. 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it

    http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...

  5. 说说icon图标

    咳咳,其实我是想copy过来的,然而,他竟然是用代码写的图标... (正经脸)话说icon图标是一种网页中常用图标的一种,网络上有各式各样的应用案例,在此就不多啰嗦了.其实我也不过是用着现成的而已,所 ...

  6. 【Vim命令大全】史上最全的Vim命令

    曾经使用了两年多的Vim,手册也翻过一遍.虽然现在不怎么用vim了,曾经的笔记还是贴出来,与喜欢vim的朋友分享. 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器. 虽然 ...

  7. [Poi2010]Bridges 最大流+二分答案 判定混合图欧拉回路

    https://darkbzoj.cf/problem/2095 bzoj 相同的题挂了,这个oj可以写. 题目就是要我们找一条欧拉回路(每个桥经过一次就好,不管方向),使得这条回路上权值最大的尽量小 ...

  8. Struts2的值栈和OGNL牛逼啊

    Struts2的值栈和OGNL牛逼啊 一 值栈简介: 值栈是对应每个请求对象的一套内存数据的封装,Struts2会给每个请求创建一个新的值栈,值栈能够线程安全的为每个请求提供公共的数据存取服务. 二 ...

  9. T3054 高精度练习-文件操作 codevs

    http://codevs.cn/problem/3054/ 题目描述 Description   输入一组数据,将每个数据加1后输出 输入描述 Input Description 输入数据:两行,第 ...

  10. bzoj2555(lct维护sam)

    题意: (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 字符串长度<=6e5,询问总长度<=3e6 分析: 考虑建个sam,然后把 ...