1、运行时数据区域

  1.1、程序计数器

      线程私有,当前线程所执行的字节码行号指示器,

      Java虚拟机的多线程是通过线程轮流切换处理器执行时间的方式来分配

  1.2、Java虚拟机栈

      线程私有,,虚拟机的局部变量表每个方法在执行的时候都会创建栈帧用于存储局部变量,操作数栈,动态链接方法出口等信息,每个方法从开始到结束

    对应着一个栈帧从入栈到出栈的过程,

  1.3、本地方法栈

      线程私有,本地方法栈是为虚拟机执行native方法服务,有的虚拟机奖本地方法栈与虚拟机栈合二为一。

  1.4、Java堆

      GC堆,垃圾收集器管理的主要区域,用于存放对象实例,几乎所有的Java对象实例都在这里分配空间,

  1.5、方法区

      用于存放虚拟机加载的类信息,常量,静态变量,方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量

  1.6、运行时常量池

       JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。

      而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。

      在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,

      以保证运行时常量池所引用的字符串与字符串常量池中是一致的。

  1.7、直接内存

      Java使用naive函数库直接分配堆外内存,避免了在java堆和native堆中来回复制数据

2、hotspot虚拟机

  2.1、对象的创建

      如果java虚拟机的空闲内存是连续的,直接向后挪出一段与对象大小相等的距离,称为 指针碰撞

      如果不连续,则从剩余内存中寻找出足够大小的内存存放,称 为 空闲列表方式

        如何避免线程安全

            为每个线程分配空间

            cas配上失败重试

  2.2对象的内存布局

      对象头:运行时的自身数据(哈希码,gc分代年龄,锁状态)、类型指针

      实例数据:对象真正存储的数据

      对齐填充:每个对象的起始地址必须为8字节的整数倍

  2.3 对象的访问定位

      句柄访问:reference指向句柄池接着再指向具体对象,避免了对象的修改而需要修改reference的修改,增加了一次寻址

      直接指针定位:直接指向具体对象,

转载于:https://www.cnblogs.com/karryzhang/p/9607522.html

java虚拟机 第二章Java内存区域与内存溢出异常相关推荐

  1. 深入Java虚拟机-第二章-Java内存区域-学习笔记

    Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...

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

    运行时数据区域 Java虚拟机运行时数据区域 程序计数器 程序计数器可以看做是当前线程所执行的字节码的行号指示器.字节码解释器工作时就是通过改变这个计数器的值来选取下一条所需要执行的字节码指令,分支. ...

  3. java 3D 第二章 java 3D基本概念

    java 3D 第二章 java 3D基本概念 java 3D基本概念 java 3D的包及其功能 java 3D 高分辨率大尺度坐标 Java 3D场景图(Scene Graph) VirtualU ...

  4. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  5. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  6. 《深入理解JAVA虚拟机》详细解读(第二章 ):JAVA内存区域与内存溢出异常

    目录 一.JAVA内存区域与内存溢出异常 1. 概述 2. 运行时数据区域 2.1 程序计数器 2.2 Java虚拟机栈 2.3本地方法栈 2.4 堆 2.5 方法区 2.6 运行时常量池 2.7直接 ...

  7. 《深入理解JAVA虚拟机》周志明 第三版 - 第二章 JAVA内存区域与内存溢出异常

    一. 概述 在虚拟机自动内存管理机制下,不容易出现内存泄漏和内存溢出问题,但是一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误.修正问题将会成为一项异常艰难的工作. 二. ...

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

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 2.1 概述 https://blog.csdn.net/q5706 ...

  9. java 计数器越界,[总结]-第二章 Java内存区域与内存溢出异常

    [总结]-第二章 Java内存区域与内存溢出异常 一.知识点 1.虚拟机运行时数据区 方法区:运行时常量池(JDK1.7被移出) 堆:存放对象实例或数组.新生代和老年代 虚拟机栈:线程私有.栈 本地方 ...

最新文章

  1. 《线性代数》概念定理大全!
  2. java protobuffer 网络_使用Protobuf定义网络协议
  3. python绘制直方图显示数字_Python实现绘制双柱状图并显示数值功能示例
  4. 爬虫+数据分析,制作一个世界疫情人数增长动态柱状竞赛图2
  5. 点在多边形内外的判断【计算几何】
  6. UML大战需求分析阅读笔记——03
  7. concurrent: CyclicBarrier
  8. 什么时候才能都及格呢?
  9. 3-idiots HDU - 4609 FFT模板
  10. linux中ssh登录Permanently added (RSA) to the list of known hosts问题解决
  11. (转)Java ConcurrentModificationException异常原因和解决方法
  12. 时间机器与iCloud云盘:应该使用哪个来备份你的Mac?
  13. 后端服务慢成狗?试试这 7 招!
  14. 使用pjsip传输已经编码的视频,源码在github
  15. 最最简单的一个爬虫代码
  16. GetClientRect、ScreenToClient、GetWindowRect、ClientToScreen、MoveWindow用法总结
  17. stm32开发板调试问题记录----去除flash读保护以及debug进不去main.c的问题
  18. win10如何打开计算机窗口,处理win10中电脑任务栏不显示打开窗口的方法
  19. 勤快的程序猿都没啥前途的,赶紧改掉你的坏毛病吧!
  20. 【学习KubeEdge】

热门文章

  1. 用管控策略设定多账号组织全局访问边界
  2. 实时计算 Flink 版总体介绍
  3. Gitee X Serverless Devs 邀你来“领赏”啦!
  4. 解读 WebRTC 音频 NetEQ 及优化实践
  5. java media player_MediaPlayerForJava(创建一个视频播放器)
  6. 干货分享:插画家Anmi的创作技巧与练习方法
  7. 关于游戏烂代码的那些事(下)
  8. 用诸葛孔明的智慧,读懂新型数据中心的“四新”机遇与产业逻辑
  9. bubble气泡特效
  10. SecureCRT 遇到一个致命的错误且必须关闭