19
2020
10

什么时候进行GC

程序员不能控制具体的时间Eden区满了会触发minor GC,老年代满或调用system.gc执行Full GC
19
2020
10

什么情况下对象进入老年代

大对象直接进入老年代(需要大量连续空间的对象)。常见的大对象就是很长的字符串和数组长期存活的对象进入老年代。每个对象有一个年龄计数器。每熬过一次moinor gc,年龄就增加一岁。当年龄增加到一定程度(默认为15)就会晋升到老年代(通过MaxTenuringThreshold设置)。动态年龄判断:如果survivor空间某个年龄对象的大小大于survivor空间的一半,年龄大于或等于的直接进入老年代空间分配担保:复制算法中,survivor中无法容纳的对象将通过分配担保机制直接进入老年代
19
2020
10

常见的垃圾收集器?

Serial收集器:单线程收集器ParNew收集器:,新生代收集器,Serial收集器的多线程版本Parallel Scavenge收集器:新生代收集器,使用复制算法。是用来实现最大吞吐量(代码运行时间/(代码运行时间+垃圾收集的时间))Serial Old收集器:Serial收集器的老年代版本Parallel Old收集器:ParNew收集器的老年代版本(一般使用Parallel Scavenge + Parallel Old)CMS收集器:是一种以获取最短停顿时间为目标的收集器。分为4个步骤
19
2020
10

垃圾收集算法有哪些

标记-清除算法:首先标记出所有的对象,标记完成后统一回收(1效率问题:标记和清除两个过程效率都不高(2空间问题:产生碎片复制算法:将内存划分为一块较大的Eden空间(80%)和两块较小的Survivor空间(10%),每次使用Eden和其中的一块Survivor,当回收时,将两者中存活的对象一次性复制到另一块Survivor,并清空刚才用到的空间,如果这块Survivor不够,则启用分配担保机制,将多处的对象存储再老年代标记-整理算法:首先标记出所有的对象,回收时让存活的对象都向一端移动,直接清
19
2020
10

内存泄漏和内存溢出的区别

内存泄漏:分配出去的内存无法回收(可达却无用的对象无法被gc回收)内存溢出:程序要求的内存超出了系统能分配的范围(如栈满进栈,栈空出栈)
19
2020
10

一个对象的内存划分是怎样的?

可分为3块区域:对象头,实例数据,对齐填充对象头由Mark world和类型指针组成mark World包括hash码,GC分代年龄,锁状态标志等。类型指针来确定这个对象是哪个类的实例实例数据是对象存储的真正的有效信息hostspot虚拟机要求对象的大小必须是8字节的整数倍
19
2020
10

java类加载机制

加载:通过类的全限定名获取类的二进制字节流,将字节流代表的静态存储结构转化为方法区的运行时数据结构。在内存生成这个类的class对象连接:包括三步验证,准备,解析验证:保证class文件的字节流中包含的信息符合当前虚拟机的要求,且不危害虚拟机自身安全准备:正式为类变量分配内存并设置类变量初始值解析:将常量池的符号引用替换为直接引用初始化:根据程序员的意愿初始化类变量
19
2020
10

类的实例化顺序

首先是父类的静态变量和静态代码块(看两者的书写顺序);第二执行子类的静态变量和静态代码块(看两者的书写顺序);第三执行父类的成员变量赋值第四执行父类类的构造代码块第五执行父类的构造方法()执行子类的构造代码块第七执行子类的构造方法();总结,也就是说虽然客户端代码是new 的构造方法,但是构造方法确实是在整个实例创建中的最后一个调用。切记切记!!!先是父类,再是子类;先是类静态变量和静态代码块,再是对象的成员变量和构造代码块–》构造方法。记住,构造方法最后调用!!!!成员变量优先构造代码块优先构
19
2020
10

说说Java线程栈

Java线程栈从线程创建时存在,并且是私有的。线程栈用户存储栈帧,栈帧用于存储局部变量、中间运算结果。所以局部是不存在并发的问题,因为每个栈是私有的。虚拟机只会对Java栈进行二种操作:以栈帧为单位的压栈和出栈。对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是有效的,称为当前栈帧(Current Stack Frame),与这个栈帧相关联的方法称为当前方法(Current Method)。执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。
19
2020
10

讲讲什么情况下会出现内存溢出,内存泄漏

内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不