面试资料整理汇总
这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。
面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了
在这里祝大家能够拿到心仪的offer!
虚拟机遇到new指令,通过在常量池里检查是否这个指令的参数(类的符号引用)已被加载,解析,初始化,如果没有的话,虚拟机去执行相应的类加载过程,经过上述的检查通过后虚拟机对新生对象分配内存,分配内存的原理就是Java堆中的内存分为用过的和空闲中间有指示器当分界线,当有新的对象,指针挪动一段与对象大小相等的距离,这种方式称为’指针碰撞’,
如果指示器不是在内存之间的话就不会指针碰撞,这样的话虚拟机就需要存一个列表记录哪些内存是可用的,对象实例分配内存时将在列表找到空闲内存划分给他剩下的再记录在空闲列表中,这种方式称为‘空闲列表’
选择哪种分配方式都是Java堆决定
有两种情况,在使用serial和parnew等带compact过程的收集器时是指针碰撞,在使用CMS这种基于MARK-sweep算法的收集器时是空闲列表在对象创建后我们需要关注一个问题,如果对象创建非常频繁的话,仅仅修改一个指针所指向的位置,在并发情况下线程也是不安全的,假如正在给对象A分配内存,指针还没得急改指针,对象B就进来
结果对象A和对象B同时使用了一个对象解决问题有两种方式
一个是对分配内存时进行同步操作,采用CAS配上失败重试方式来保证
另一种分配内存时按照不同线程划分在不同的空间内进行。就是把每个线程事先都分配一小块内存称为‘本地线程分配缓冲’,只有本地线程分配缓冲用完需要分配新的本地线程分配缓冲,需要同步锁定。运行Java虚拟机时可以通过-XX:+/-UseTLAB参数设定 ,如果这样的话保证了对象的实例字段在Java代码中可以不给初始值,直接用,因为对象分配内存完成后都初始化为零值
通过我上面讲的,怎么在虚拟机java堆创建对象分配内存,在程序来说才刚刚开始,init方法没有执行所有字段都为零,在我们开发者角度来说这个对象还没有创建成功,通过new指令执行init方法后这个对象才创建成功
1.详细介绍对象的内存布局
一个对象在内存布局中分为3块局域 对象头,实例数据和对齐填充
对象头:一部分用于存储对象自身的运行数据,比如哈希码,GC分代年龄,锁状态标志,线程持有的锁等等,另一部是类型指针就是对象指向他的类元数据的指针,虚拟机通过这个来确定这个对象是哪个类的对象,再一个不一定所有的虚拟机实现都必须在对象数据上保留类型指针,普通Java对象的元数据信息可以确定Java对象的大小,如果是数组的元数据无法确定数组的大小
实例数据:对象真正存储的有效信息就是代码中所定义的各种类型的字段内容,不管父类继承下来的,还是子类定义的都得记录一下,储存顺序根据虚拟机分配策略和字段在Java源码定义的顺序有影响
最后
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
/bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**