A10. JVM 对象】的更多相关文章

[概述] 首先需要了解对象在内存中的存储布局,其次需要了解对对象的访问定位. [对象的内存布局] 在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为 3 块区域:对象头(Header).实例数据(Instance Data)和 对齐填充(Padding). HotSpot 虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据,如哈希码.GC 分代年龄.锁状态标志.线程持有的锁.偏向线程 ID.偏向时间戳等,这部分数据的长度在 32 位和 64 位的虚拟机(为开启压缩指针)…
这一节我们来讨论一下JVM对象建立过程. JVM对象探秘 对象的建立 对象的内存布局 对象的访问定位 JVM对象探秘 对象的建立 对象的建立过程   图一:对象建立过程 1.类加载检查. 当JVM检测到有一条new指令时,首先先检查该指令的参数是否在常量池中定位到一个类的符号引用,并检查这个符号引用所代表的类是否已被加载.解析和初始化过.如果存在的话,JVM将直接使用已有的信息对该类进行操作. 如果没有,则执行相应的类加载过程. 2.为新生对象分配内容. 不同的JVM垃圾收集器在内容分配的时候的…
1.JVM对象创建:java程序运行过程中,无时无刻都有对象被创建出来.在语言层面上就是new关键字. 2.JVM对象创建过程: (1)JVM遇到一条new指令后,首先会去常量池中,检查这个指令的参数是否有一个类的符号引用,并检查这个符号引用代表的类是否被加载.解析.初始化过.如果没有就执行类加载过程. (2)类加载检查通过后,JVM为新生对象分配内存.其中内存的大小在类加载完后即可完全确定,而分配内存空间其实就是在JVM堆中为对象划分出一块确定大小的内存.. (3)内存分配完成后,虚拟机就将分…
最近在学习java基础结构,刚好学到了jvm,总结了以下并可以结合思维导图认识以下Jvm的对象: 栈:什么是栈? 先说一下栈的数据结构吧,栈它是一种先进后出的数据结构(FILO),跟队列刚好相反(先进先出FIFO),生活中有哪些例子, 举个例子 给子弹上膛,上弹的操作就类似于栈的数据结构,先压入的子弹后发射,因为它被压入到了最底部(栈底),所以,它会先发射最上面的子弹(栈顶), 说了这个概念,想必应该已经熟悉了栈的数据结构了吧. 再说一下栈,栈相当于一个桶,里面有方法区,局部变量表,方法返回地址…
1 引用计数法     给一个对象添加一个引用计数器,每当有一个地方引用时,计数器加1,当引用失效的时候,计数器减去1.当计数器为0的时候,表示对象不可能再被使用.此时表明该对象可以被回收.     缺点:难以对象之间互相引用. package com.dusk.service.jvm; /** * @Authgor: gosaint * @Description: * @Date Created in 22:14 2018/9/10 * @Modified By: */ public clas…
一.GC主要针对什么区域 1. 程序计数器.虚拟机栈.本地方法栈,3个部分随线程而生死.每个栈桢分配多少内存基本上是在类结构确定下来时就已确定,大体上可认为是 编译期可知. 2. 而 堆 和 方法区 则不一定,如一个接口多个实现类需要内存不一样,一个方法多个分支需要分配内存也不一样:这些只有一实现运行中才能得知会创建那些对象,这部分内存的分配 和 回收 都是动态的.GC主要关注的也是这两个部分. 二.对象的“存活”: 1.引用计数法:在各个对象中添加一个引用计数器. a. 实现简单,判定效率高:…
一.jvm简单结构图 1.jvm内存对象分配整体流程: 1.类加载子系统和方法区 类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外, 方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射). 2.java堆 堆空间在jvm启动的时候即根据设置(后续 jvm参数调优)创建,是java程序中最主要的内存工作区域.堆空间是所有线程共享的. jvm分配对象,一般来说,new…
最近生产环境出现一个很奇怪的问题,测试环境无法重现,本地直连生产无法重现.于是用上 jmap + Java VisualVM 的 OQL (Object Query Language) 分析问题. 关于OGL的文章不多,特此转载,原文出处:https://blog.csdn.net/pange1991/article/details/82023771 本文主要翻译自JDK 1.8的JVM监控工具jhat中关于OQL的英文帮助说明. 可以在jhat 和 jvisualvm 中进行实践. OQL(对…
1.JVM中执行字节码new指令时: 1.1.分配内存 分配策略有两种方式:(1)指针碰撞 当JVM内存区域是连续的规整的,所有用过的内存都放在一边,空闲的内存都放在另外一边,中间放着 指针作为分界点的指示器,再分配内存的时候,只需将指针移动对象大小的距离就可以 (2)空闲列表,当JVM内存区域不是连续的,需要一个空闲的列表记录那些是被占用.那些未被占用,通过列表来查找对象大小的内存进行分配 注:选择哪种分配方式由JVM内存是否规整决定,内存是否规整有垃圾回收算法决定 1.2.分配内存线程安全问…
内存分配机制   逐步分析 类加载检查: 虚拟机遇到一条new指令(new关键字.对象的克隆.对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被加载过,如果没有那么就去加载该类 分配内存 类加载完毕后会给对象分配内存空间.对象的所需的内存大小在类加载完毕后就便可完全确认,为对象分配内存大小的空间等同于把一块确定大小的内存从java堆中划分出来. 如何划分内存? 指针碰撞(默认使用指针碰撞):如果java堆内存是绝对规整的,那么会把所有用…