注意: 我们可以看到的就是InstanceData的数据. 先转载一篇文章作为开头,因为讲的非常详细,我就简单加工下放到这里: 对象结构 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding).下图是普通对象实例与数组对象实例的数据结构: 对象头 HotSpot虚拟机的对象头包括两部分信息: markword 第一部分markword,用于存储对象自身的运行时数据,如哈希码(HashCode).…
引用其他人的文章: https://www.cnblogs.com/YYfish/p/6722258.html 那是怎么访问对象呢? java 程序是通过栈上的reference数据来操作堆上的具体对象的. 首先我们回顾一下虚拟机栈: 虚拟机栈是 java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 局部变量表存放了编译期可知的各种基本数据类型(long,boolean,int,byte,short,l…
第一部分 走进Java第1章 走进Java 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常2.1 概述2.2 运行时数据区域2.2.1 程序计数器2.2.2 java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常量池2.2.7 直接内存2.3 HotSpot虚拟机对象探秘2.3.1 对象的创建2.3.2 对象的内存布局2.3.3 对象的访问定位2.4 实战:OutOfMemoryError异常2.4.1 Java堆溢出2.4.2 虚…
第十章 早期(编译期)优化 1.Javac的源码与调试 编译期的分类: 前端编译期:把*.java文件转换为*.class文件的过程.例如sun的javac.eclipseJDT中的增量编译器. JIT编译期:后端运行期编译器,把字节码转换成机器骂的过程.例如 HotSpot VM的C1.C2编译器. AOT编译器:静态提前编译器,直接拔Java文件编译成本地机器代码的过程,例如GCJ. Javac的编译过程: 解析与填充符号表的过程. 插入式注解处理器的注解过程. 分析与字节码生成的过程. J…
第十章 早期(编译期)优化 1.Javac的源码与调试 编译期的分类: 前端编译期:把*.java文件转换为*.class文件的过程.例如sun的javac.eclipseJDT中的增量编译器. JIT编译期:后端运行期编译器,把字节码转换成机器骂的过程.例如 HotSpot VM的C1.C2编译器. AOT编译器:静态提前编译器,直接拔Java文件编译成本地机器代码的过程,例如GCJ. Javac的编译过程: 解析与填充符号表的过程. 插入式注解处理器的注解过程. 分析与字节码生成的过程. J…
1.概述 jvm内存分为线程共享区和线程独占区,线程独占区主要包括虚拟机栈.本地方法栈.程序计数器:线程共享区包括堆和方法区 2.线程独占区 虚拟机栈 虚拟机栈描述的是java方法执行的动态内存模型,每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成.用于存储局部变量表,操作数栈,动态链接,方法出口等. 本地方法栈 本地方法执行 程序计数器 3.线程共享区 3.1.堆 堆主要用于存放对象的实例,占据JVM中最大的一块内存空间,也是GC的主要工作区域.堆中空间又分为,新生代.老年代 3.2…
1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下面分步骤详细讲解 A: 虚拟机为对象分配内存方式 1. 指针碰撞: 堆内存规整时,这时就可以把其看做一半连续内存被占用,一半连续的内存空闲.所以当创建新对象时,从空闲的内存中分配空间给新对象 2.空闲列表: 堆内存是不连续的,这就需要虚拟机维护一个内存列表,用于记录当前内存是否被占用,当新创建对象时…
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cnblogs.com/wengshuhang/p/10073587.html 前言: 毕业后啥也不懂,水了一年,结果现在很多java基础的东西都不会,跳槽时候很艰难,现在开始恶补,首先是jvm--->深入理解java虚拟机(ps:买了半年都没翻过) 写博客的初始目的也只是为了记录一下自己认识到的知识点…
正文 一.Java 内存区域与内存溢出异常 1.运行时数据区域 程序计数器:当前线程所执行的字节码的行号指示器.线程私有. Java 虚拟机栈:Java 方法执行的内存模型.线程私有. 本地方法栈:Native 方法执行的内存模型.线程私有. Java 堆:存放对象实例.分为新生代(Eden 空间.From Survivor 空间.To Survivor 空间)和老年代.线程共享. 方法区:存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据.也称为"永久代".线程…
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念,才能继续往下学习. 本节学习重点 本节主要是针对JVM内存管理机制的一些监控手段,例如堆情况使用的监控,线程栈情况的监控等.有几句废话还是有必要在这里强调的,工具是人类思维的工具,例如Java语言是人类满足需求的一种技术手段,而监控工具只是维护程序应用的一种手段.所以,思考的逻辑思维要清晰,是问题引导工具,…