第2章 Java内存区域与内存溢出异常

运行数据区域

  1、程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。

  2、Java虚拟机栈(Stack)线程私有,每一个方法调用时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。局部变量存放了编译期可知的各种基本数据类型(boolean,byte,char,short,int,float,long,double)、对象引用(reference类型)和returnAddress类型。

  3、本地方法栈(Native Method Stack),为虚拟机的本地方法提供的栈

  4、java堆(Heap) 所有线程共享的一块内存区域,存放对象实例。可能会被分为:新生代和老年代。再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。

  5、方法区(Method Area) 各纯种共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。通常被 称为 永久代(Permanent Generation)

  6、运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存放编译期生成的各种 字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

  7、直接内存(Direct Memory)

HotSpot虚拟机对象探秘

对象创建

  1、虚拟机遇到一个new指今,检查这个指今参数是否能在常量池中定位。

  2、检查这个符号引用代表的类是否已被加载解析和初始化

    如果没有先执行相应的类加载过程。

  3、分配内存,对象所需内存的大小在类加载完成后便可完全确定。

  4、将分配的内存空间都初始化为零值,这一步保证了对象的实例字段在java代码中可以不赋初始值就直接使用。

  5、虚拟机对对象进行必要的设置,如何才能找到类的元数据信息、对象的哈希码、对象的GC分代等这些信息存放在对象的对象头中

  6、构造函数

对象的内存布局:可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)

对象的访问定位:

  通过句柄访问对象

  对过直接指针访问对象

最新文章

  1. 全文检索学习历程目录结构(Lucene、ElasticSearch)
  2. Openjudge 3.9-3339
  3. JavaScript——exec和match
  4. {POJ}{树状数组}
  5. a + b + c 求和
  6. MySQL之aborted connections和aborted clients
  7. Java 任务调度
  8. 织梦dedecms后台添加图片style全部都变成st<x>yle的解决办法
  9. poj 1182 并查集高级应用
  10. sql server 数值的四舍五入
  11. 【2017-06-02】Jquery基础
  12. 浅谈Fastfds+nginx结合_单机
  13. JavaScript图片翻转
  14. redis & memcache 性能比较
  15. Django框架的使用教程--mysql数据库[三]
  16. Luogu1344 追查坏牛奶 最小割
  17. 素数问题练习_HDOJ1262
  18. can not create symbolic link HDFS解压自动配置lib报错。
  19. nginx:负载均衡实战(四)nginx+keepalived配置双机热备
  20. [Vuejs] 组件 v-if 和 v-show 切换时生命周期钩子的执行

热门文章

  1. 对Java 静态代码块的一些了解
  2. CROS跨域 解决方案 之 tomcat 做过滤处理解决
  3. 【leetcode刷题笔记】Rotate Image
  4. 【META http-equiv="Content-Type" Content="text/html; Charset=*】意义详解
  5. Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory.
  6. Jave基础之选择排序
  7. Cisco、HUAWEI、H3c、Firewall等设备配置snmp
  8. git多站点帐号配置
  9. 安装pysqlite2
  10. mysql实际使用思路