java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分
Java内存划分
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如下图
一、程序计数器
程序计数器(Program Counter Register)是一块很小的内存空间,就像计算机组成原理的PC寄存器,它可以看作当前线程所执行的字节码的行号指示器,解释器通过改变计数器的值来实现分支、循环等操作。为了防止线程切换之后找不到原来执行的位置,每个线程都单独拥有一个程序计数器,可以称这类内存为“线程私有”内存。
二、Java虚拟机栈
它和程序计数器一样是线程私有的,当每个方法执行的时候Java虚拟机都会产生一个栈帧(Stack Frame),栈帧中存储了局部变量表(注:进入一个方法的时候,方法所需要的局部变量大小是确定的,不会再改变)、操作数栈、动态链接、方法出口等信息)
在Java虚拟机创建完栈帧之后就会把它入栈到虚拟机栈中,当执行完毕后就将栈帧出栈,因此当无限递归时,会创造大量的栈帧进入到虚拟机栈中,就会产生StackOverflow异常public static void stackLeak(){
stackLeak();
}
public static void main(String[] args) {
stackLeak();
}
运行结果为
除了上述情况,当使用的Java虚拟机允许动态扩展虚拟机栈的时候,就会一直申请内存扩展虚拟机栈,直到无法申请到足够的内存,这时候便会产生OutOfMemoryError异常
三、本地方法栈
本地方法栈与虚拟机栈十分相似,虚拟机栈为Java方法提供服务,而本地虚拟机栈为本地方法服务,在栈深度溢出的时候也会产生StackOverflowError或者OutofMemoryError
四、Java堆
Java堆与虚拟机栈不同,它是所有线程共享的一片区域,它只有一个功能就是存放对象实例,我们平时使用的对象变量里面存放的则是对象地址,它指向堆中的对象实例。
一直循环生成新的对象便会造成Java堆溢出,而产生OutOfMemory异常static class OOMObject{
}
public static void main(String[] args) {
//使用list保持引用,防止GC回收对象
List list= new ArrayList();
while(true){
list.add(new OOMObject());
}
}
使用虚拟机参数-Xms20m -Xmx20m限制堆大小为20m不可扩展,运行上述程序后结果为
可以看出一直产生新对象,就会占满堆内存
五、方法区
方法区与Java堆一样,也是各个线程所共享的区域,它存储了每一个类的结构信息(Class文件),例如运行时常量池,字段和方法数据,构造函数和普通方法的字节码内容,还包括一些在类,实例,接口初始化时用到的特殊方法。
当限制方法区大小并且不断加载类文件的时候,方法区就会溢出,从而产生OutOfMemory异常
java虚拟机内存分为,深入理解Java虚拟机笔记(一)----内存划分相关推荐
- Java虚拟机这一块 —— 深入理解java虚拟机(jvm)
jvm深入理解 为什么要了解虚拟机 虚拟机历史 未来的 Java 技术 模块化 多核并行 丰富语法 64 位 更强的垃圾回收器(现在主流 CMS.G1) JavaSE 体系架构 JDK JRE JVM ...
- 怎么把虚拟机清空内存_深入理解java虚拟机1——内存管理机制与回收机制
文中涉及JVM底层知识大多来自<深入理解Java虚拟机>第2版,内容枯燥乏味,如果看,认真看.跟着撸一遍也可以受益良多. 1.JVM:是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...
- java eden space_《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读...
堆内存使用分析,垃圾收集器 GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要 ...
- linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)
本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...
- JAVA好书之《深入理解Java虚拟机》
最近打算做好现有工作的前提下,扎实一下自己专业的技术知识,并将相关的经典书也记录一下.今天看了一些JVM相关的知识,这里面的经典是<深入理解Java虚拟机>,适合有点基础又想深入理解其中原 ...
- java虚拟机编程_深入理解Java虚拟机(一)
一.运行时数据区域 1.程序计数器: 当前线程执行字节码的行号指示器(通过改变计数器的值来选择下条需要执行的字节码指令) 每个线程有独立的程序计数器(线程私有,为了切换线程时能恢复到挣钱的执行位置) ...
- 【Java面试宝典】深入理解JAVA虚拟机
一.运行时数据区域 线程隔离:线程隔离的意思,就是给不同的线程多分配的资源用,以做到不争用. 线程共享:线程共享就是资源只有一个没有办法分配更多,只能共享. Java虚拟机管理的内存包括几个运行时数据 ...
- java加载并运行虚拟机_《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?...
Java虚拟机是如何加载Java类的? 这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...
- java 常量折叠_深入理解Java虚拟机之早期编译器优化
Javac编译器 Javac编译器是一个由Java语言编写的程序 Javac的源码与调试 从Sun Javac的代码来看,编译器大致分为3个过程: 解析与填充符号表的过程 插入式注解处理器的注解处理过 ...
最新文章
- labview曲线上两点画延长线_教你用直尺画各种几何图形
- linux 系统中用root切换到普通用户时显示的异常如-bash-4.1$
- 销货清单打印软件_地磅软件管理系统 大宗物资称重管理车运版
- mysql 浮点数补零_如何执行MySQL的'SUM',但'0'小数位?
- 卡特兰(Catalan)数列
- 读书笔记:陈希孺:概率论与数理统计:2014.01.01
- 红帽学习笔记[RHCSA] 第三课[输出重定向、Vi编辑器]
- 鼠标悬停一段时间再触发事件
- AUTOCAD输出打印图片格式时空白
- 读《第十一根手指》奏明第三本
- 兜兜转转解决office和visio不能同时安装的问题
- Composer 源切换/composer 镜像网
- linux命令和选项作用,linux tar 命令中 -f选项作用
- storyboard 苹果启动图_iOS 13使用LaunchScreen.storyboard适配各尺寸启动图
- Android开发技术周报 Issue#27
- CMWAP和CMNET 的区别与适用范围
- 计算机网路络课设_学生宿舍网络规划与设计
- python绘制并列的条形图的方法_python matplotlib库绘制条形图练习题
- 《前端》html总结
- YII Framework学习教程-YII的Model-开发规范-路径别名-命名空间-2011-11-22
热门文章
- map评价吗 voc数据集可以用coco_【庖丁解牛】从零实现RetinaNet(九):使用COCO预训练权重在VOC上训练RetinaNet...
- 精选四款命令行「神器」:美、快、爽!
- Linux 实时查看日志文件的 4 种方法
- 四种主流的 API 架构风格对比
- 为什么不建议在代码中使用 User 这个单词?
- 关于程序猿鄙视链,哽咽
- JAVA:红黑树详解
- 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
- 告别CPU,加速100-1000倍!只用GPU就能完成物理模拟和强化学习训练
- 神经网络不收敛的 11 个原因,加实践感悟