前言 前两天在一个帖子中看到一道面试题: 堆内存超过32G时,为什么压缩指针失效? 之前没有了解过这方面的知识,于是开始google起来,但当我翻看了不下一页的帖子,我都仍然没有搞懂,因为好多答案给我的感觉更像是: 因为堆内存超过32G,压缩指针会失效,所以堆内存超过32G时,压缩指针会失效. 我:??? 本着有问题搞不懂就吃不下冰激凌的原则,我决定搞清楚这个问题. 32位和64位 首先我们都知道知道操作系统有32位操作系统(别名 x86 )和64位操作系统(别名 x86-64 或 x64),相…
一.对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针)   1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程 ID.偏向时间戳等等. JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 64bit, 在 64-bit JVM 上占用 128bit 即 16 bytes(暂不考虑开启压缩指针的场景). 另外,如果对象是一个 Java 数组,那在对象头中还…
java对象探秘 java是一门面向对象的语言,我们无时无刻不在创建对象和使用对象,那么java虚拟机是如何创建对象的?又是如何访问对象的?java对象中究竟存储了什么运行时所必需的数据?在学习了java虚拟机数据的存储区域后,再来探究一下对象是如何产生的? 对象是如何创建的? 对于使用者来说,创建对象仅仅只是new一个对象而已.但对于虚拟机来说,却是一系列的过程. 1.检查对象所属类是否进行过类加载 虚拟机在遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,…
Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了.对于非基本类型的Java对象,其大小就值得商榷.在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小. 看下面语句:Object ob = new Object();这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte.4byte是上面部分所说的Java栈中保存引用的所需要的空间. 而那8byte则是Java堆中对象的信息.因为所有的Java非基本…
首先了解一下JMM中定义的内存操作: 一个线程操作数据时候都是从主内存(堆内存)读取到自己工作内存(线程私有的数据区域)中再进行操作.对于硬件内存来说,并没有工作内存和主内存的区分,这都是java内存模型划分出来的,它只是一种抽象的概念,是一组规则,并不是实际存在的.Java内存模型中定义了八种同步操作: 1.lock(锁定):作用于主内存的变量,把一个变量标记为一条线程独占状态 2.unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定 3…
基础类型数据的大小是固定的,对于非基本类型的java对象,其大小就值得商榷了.      在java中一个空Object对象的大小是8byte,这个大小只是保存堆中没有任何属性的对象的大小,看下面的语句: Object obj = new Object();      这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte. 4byte是上面部分所说的Java栈中保存引用的所需要的空间.而那8byte则是Java堆中对象的信息. 因为所有的Java非基本类型的对象都…
欢迎关注公众号:bin的技术小屋 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章<从内核角度看IO模型的演变>,在这篇文章中我们通过图解的方式以一个C10k的问题为主线,从内核角度详细阐述了5种IO模型的演变过程,以及两种IO线程模型的介绍,最后引出了Netty的网络IO线程模型.读者朋友们后台留言都觉得非常的硬核,在大家的支持下这篇文章的目前阅读量为2038,点赞量为80,在看为32.这对于刚刚诞生一个多月的小号来说,是一种莫大的鼓励.在这里bin…
对象的创建 一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查.对象分配内存.并发处理.内存空间初始化.对象设置.执行ini方法等. 主要流程如下: 1. 类加载检查 JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类的加载过程. 2. 对象分配内存 对象所需内存的大小在类加载完成后便完全确定(对象内存布局),…
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 对象的创建 虚拟机遇到一条 new 指令时,首先去检查这个指令的参数是否能在方法区常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,就必须先执行相应的类加载过程. 类加载检查过后,虚拟机为新生对象分配内存.对象所需内存大小在类加载过后就完全确定,为对象分配空间就等同于,从 Java 堆中划分出一块确定大小的内存. 此时有两种情况: 如果 Java…
认真学习过java的同学应该都知道,java对象由三个部分组成:对象头,实例数据,对齐填充,这三大部分扛起了java的大旗对象,实例数据其实就是我们对象中的数据,对齐填充是由于为了规则分配内存空间,java对象大小一定是8字节的整数倍,但是我们也不能让程序员来控制吧,所以当不够8位时,会自动填充至8的整数倍,对象头记录了hash值,gc年龄,锁状态(偏向锁还会记录线程id),gc状态等等,它还保存了对象的class指针,可谓是核心中的核心,有兴趣的同学可以去看一下关于我写的对象的一些介绍:htt…