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虚拟机笔记(一)----内存划分相关推荐

  1. Java虚拟机这一块 —— 深入理解java虚拟机(jvm)

    jvm深入理解 为什么要了解虚拟机 虚拟机历史 未来的 Java 技术 模块化 多核并行 丰富语法 64 位 更强的垃圾回收器(现在主流 CMS.G1) JavaSE 体系架构 JDK JRE JVM ...

  2. 怎么把虚拟机清空内存_深入理解java虚拟机1——内存管理机制与回收机制

    文中涉及JVM底层知识大多来自<深入理解Java虚拟机>第2版,内容枯燥乏味,如果看,认真看.跟着撸一遍也可以受益良多. 1.JVM:是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  3. java eden space_《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读...

    堆内存使用分析,垃圾收集器 GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建.一些类信息,常量,静态变量等存储在方法区.堆和方法区都是线程共享的. GC机制是由JVM提供,用来清理需要 ...

  4. linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)

    本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...

  5. JAVA好书之《深入理解Java虚拟机》

    最近打算做好现有工作的前提下,扎实一下自己专业的技术知识,并将相关的经典书也记录一下.今天看了一些JVM相关的知识,这里面的经典是<深入理解Java虚拟机>,适合有点基础又想深入理解其中原 ...

  6. java虚拟机编程_深入理解Java虚拟机(一)

    一.运行时数据区域 1.程序计数器: 当前线程执行字节码的行号指示器(通过改变计数器的值来选择下条需要执行的字节码指令) 每个线程有独立的程序计数器(线程私有,为了切换线程时能恢复到挣钱的执行位置) ...

  7. 【Java面试宝典】深入理解JAVA虚拟机

    一.运行时数据区域 线程隔离:线程隔离的意思,就是给不同的线程多分配的资源用,以做到不争用. 线程共享:线程共享就是资源只有一个没有办法分配更多,只能共享. Java虚拟机管理的内存包括几个运行时数据 ...

  8. java加载并运行虚拟机_《深入理解Java虚拟机》- Java虚拟机是如何加载Java类的?...

    Java虚拟机是如何加载Java类的?  这个问题也就是面试常问到的Java类加载机制.在年初面试百战之后,菜鸟喜鹊也是能把这流程倒背如流啊!但是,也只是字面上的背诵,根本就是像上学时背书考试一样. ...

  9. java 常量折叠_深入理解Java虚拟机之早期编译器优化

    Javac编译器 Javac编译器是一个由Java语言编写的程序 Javac的源码与调试 从Sun Javac的代码来看,编译器大致分为3个过程: 解析与填充符号表的过程 插入式注解处理器的注解处理过 ...

最新文章

  1. labview曲线上两点画延长线_教你用直尺画各种几何图形
  2. linux 系统中用root切换到普通用户时显示的异常如-bash-4.1$
  3. 销货清单打印软件_地磅软件管理系统 大宗物资称重管理车运版
  4. mysql 浮点数补零_如何执行MySQL的'SUM',但'0'小数位?
  5. 卡特兰(Catalan)数列
  6. 读书笔记:陈希孺:概率论与数理统计:2014.01.01
  7. 红帽学习笔记[RHCSA] 第三课[输出重定向、Vi编辑器]
  8. 鼠标悬停一段时间再触发事件
  9. AUTOCAD输出打印图片格式时空白
  10. 读《第十一根手指》奏明第三本
  11. 兜兜转转解决office和visio不能同时安装的问题
  12. Composer 源切换/composer 镜像网
  13. linux命令和选项作用,linux tar 命令中 -f选项作用
  14. storyboard 苹果启动图_iOS 13使用LaunchScreen.storyboard适配各尺寸启动图
  15. Android开发技术周报 Issue#27
  16. CMWAP和CMNET 的区别与适用范围
  17. 计算机网路络课设_学生宿舍网络规划与设计
  18. python绘制并列的条形图的方法_python matplotlib库绘制条形图练习题
  19. 《前端》html总结
  20. YII Framework学习教程-YII的Model-开发规范-路径别名-命名空间-2011-11-22

热门文章

  1. map评价吗 voc数据集可以用coco_【庖丁解牛】从零实现RetinaNet(九):使用COCO预训练权重在VOC上训练RetinaNet...
  2. 精选四款命令行「神器」:美、快、爽!
  3. Linux 实时查看日志文件的 4 种方法
  4. 四种主流的 API 架构风格对比
  5. 为什么不建议在代码中使用 User 这个单词?
  6. 关于程序猿鄙视链,哽咽
  7. JAVA:红黑树详解
  8. 帝国cms7.5多终端刷新单条内容信息时不起作用的解决方法
  9. 告别CPU,加速100-1000倍!只用GPU就能完成物理模拟和强化学习训练
  10. 神经网络不收敛的 11 个原因,加实践感悟