JVM-Java内存区域与内存溢出异常
第二章:Java内存区域与内存溢出异常
2.1 运行时数据区


1:程序计数器 : 线程私有,较小的内存空间,当前线程所执行的字节码的行号指示器,唯一不会发生错误的内存区域
2:虚拟机栈: 线程私有,生命周期和线程相同,为虚拟机执行Java方法服务,指的是Java内存模型,可发生StackOverflowError(栈溢出错误)和OutOFMemoryError============待后续详细学习(其中每一个栈帧中分配的内存大小基本上在类结构确定下来就是已知的)
3:本地方法栈:线程私有,为虚拟机使用到的native方法服务,可发生StackOverflowError(栈溢出错误)和OutOFMemoryError
4:Java堆:线程共享,最大的内存空间,GC的主要区域,可发生OutOFMemoryError
5:方法区:线程共享,存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,GC的主要目的是对常量池的回收和类型的卸载,可发生OutOFMemoryError
jdk1.7:永久代 jdk1.8:metaspace
6:运行时常量池:方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池信息,用于存放编译期各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池,可发生OutOFMemoryError
7:直接内存:并不是虚拟机运行时数据区的一部分,直接内存的分配会受到本机器总内存的大小限制,可发生OutOFMemoryError,不会主动使虚拟机发生垃圾回收,只能在虚拟机发生回收时顺便回收内存。
2.2 HotSpot虚拟机对象
1:对象的内存布局

运行时数据:存储对象自身的运行时数据,包括哈希吗(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等,官方称为Mark Word,非固定的数据结构
类型指针:指向它类元数据信息的指针,并不是所有的虚拟机实现都在对象数据上保留类型指针 注意:Java数组的对象头中还有一块用于记录数组长度的区域
实例数据:包括类自己、父类继承的、子类中定义的信息,将父类、类、子类的信息整合,相同宽度的字段被分配到一起
对齐填充:不是必然存在的,也没有特别的含义,仅仅起着占位符的作用
2:对象的访问定位


注:对象移动和访问在Java中是非常频繁的,HotSpot虚拟机使用的是直接指针访问对象的方式,但两种方式都很常见
通过句柄访问对象:优势是reference中存储的是稳定的句柄地址,对象发生移动时只会改变句柄中的实例数据指针,reference本身不需要改变
通过直接指针访问对象:优势是速度快,节省了一次指针定位的时间开销
3:VM参数配置
Java堆参数设置:-Xms20m -xmx20m -xX:+HeapDumpOnOutOfMemoryError(虚拟机出现内存异常时Dump 出当前的内存堆转储快照以便后续分析 heap space)
Java栈参数设置:-Xss128k 栈内存大小 = 所有线程占有内存大小,每个线程占有内存大小 = 线程执行过程中每个方法(栈帧)的大小之和
方法区和运行时常量池:-XX:permSize=10M -XX:MaxPermSize=10M (PermGen space)
直接内存:-XX:MaxDirectMemorySize=10M,如果不指定则默认和Java堆最大值一样
ps:欢迎大家评论,批评指正
JVM-Java内存区域与内存溢出异常的更多相关文章
- JVM内存区域与内存溢出异常
Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域,不同的区域在内存不足时会抛出不同的异常. >>运行时数据区域的划分 (1)程序计数器程序计数器(Progra ...
- 深入理解java虚拟机系列(一):java内存区域与内存溢出异常
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...
- 深入理解java虚拟机---->java内存区域与内存溢出异常
2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...
- 第二章Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 一.概述 对与Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每个new操作去写delete/free代码,不容易出现内存泄露和内存溢出问 题, ...
- 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域
- 深入了解Java虚拟机(1)java内存区域与内存溢出异常
java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局 ...
- 2.1 自动内存管理机制--Java内存区域与内存溢出异常
自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...
- 虚拟机--第二章java内存区域与内存溢出异常--(抄书)
这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...
- 深入理解Java虚拟机之Java内存区域与内存溢出异常
Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...
- 深入理解Java虚拟机之图解Java内存区域与内存溢出异常
Java内存区域与内存溢出异常 运行时数据区域 程序计数器 用于记录从内存执行的下一条指令的地址,线程私有的一小块内存,也是唯一不会报出OOM异常的区域 Java虚拟机栈 Java虚拟机栈(Java ...
随机推荐
- Navicat自动备份数据库
@ 目录 Navicat自动备份数据库 备份与还原 修改备份位置 MySQL:5.7 Navicat:11 Windows10 重要数据库的定时备份是非常重要的,使用Navicat可以非常方便快捷地自 ...
- 9. js屏幕截图
html2canvas 该脚本允许您直接在用户浏览器上截取网页或部分网页的“屏幕截图”.屏幕截图基于DOM,因此它可能不是真实表示的100%准确,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息 ...
- ansible playbook loop 翻译
ansible源文档地址 有时候你想多次重复一个任务. 在计算机编程中,这叫做循环. 常见的 Ansible 循环包括使用文件模块更改几个文件和 / 或目录的所有权,使用用户模块创建多个用户,并重复一 ...
- 改善 Python 程序的 91 个建议
1.引论 建议1:理解Pythonic概念—-详见Python中的<Python之禅> 建议2:编写Pythonic代码 避免不规范代码,比如只用大小写区分变量.使用容易混淆的变量名.害怕 ...
- 使用 Python 控制自己的电脑和键盘是一种什么样的体验?python学习的正确姿势
可能有时候你需要在电脑做一些重复的点击或者提交表单等操作,如果能通过 Python 预先写好相关的操作指令,让它帮你操作,然后你自己爱干嘛干嘛去,有点 “按键精灵” 的意思,是不是感觉有点爽呢? 那么 ...
- 手机app抓包[小米]
方案一:(手机电脑在同一wifi下) 打开burp设置代理 这里的ip为电脑的ip 手机手动设置代理为电脑的ip+8080 导入证书 电脑上下载下证书(http://burp) 传到手机上
- Linux 如何通过 iscsi target name 获取 ip
by Mike Andrews # lsscsi -t [:::] disk iqn.-.com.blockbridge:t-pjxfzufjkp-illoghjk,t,0x1 /dev/sda [: ...
- vue 开发规范
本文档为前端 vue 开发规范 规范目的 命名规范 结构化规范 注释规范 编码规范 CSS 规范 规范目的 为提高团队协作效率 便于后台人员添加功能及前端后期优化维护 输出高质量的文档 命名规范 为了 ...
- asList和ArrayList不得不说的故事
目录 简介 创建ArrayList UnsupportedOperationException asList 转换 总结 asList和ArrayList不得不说的故事 简介 提到集合类,ArrayL ...
- mac OS 安装 Homebrew软件包管理器
Homebrew macOS 缺失的软件包的管理器 中文官网 https://brew.sh/index_zh-cn 获取安装命令 /usr/bin/ruby -e "$(curl -fsS ...