密集知识点

重载:一个方法多种签名。重写:子类重新实现父类方法。多态:调用的是子类还是父类中的方法只有运行时才能判断。Stringbuffer线程安全,stringbuilder不安全。代理模式:代理对象代替真实对象,不修改原对象提供额外功能。静态代理,动态代理,jdk动态代理,cglib动态代理。IO:用户空间、内核空间。Bio:同步阻塞,在线等,read,return。NIO:同步非阻塞:反复询问。Io多路复用:select,准备好了通知我,ready,read,return。AIO:异步:回调。Arraylist:线程不安全,底层是数组,尾部有空余空间,可randomAcess,尾部增删O(1),中间增删O(n),JDK7 new无参arrayList时直接创建10长度Object[]数组elementData,单例饿汉式,类加载时就初始化,jdk8懒汉式,第一次调用时才初始化。插入扩容过程:1对插入位置合法性检查,2.判断剩余空间足够大,3给邻居挪位置,4插入,size增加。如空间不够,位运算扩容到max(10,1.5倍n)。hashMap:非线程安全,初始容量16(定位筒快),负载因子0.75,拉链法(tree)解决hash冲突,扩容:每次扩容成2倍,1计算新容量和新阈值,创建新数组,节点映射到新数组里,如果有树要拆。内存管理:堆,线程共享,new出来的对象和数组,gc区域。虚拟机(本地方法)栈:线程私有,局部变量表(基本数据类型,对象引用地址)。程序计数器:循环。方法区:线程共享,已加载的类信息(构造函数、字段方法),常量,静态变量,运行时常量池(1.7挪到堆里)。IOC:让spring框架来创建对象,简化开发,不需要搞清底层类构造函数。AOP:基于动态代理。gc:如何判断对象是否死亡,引用计数法,可达性分析算法,Gcroot,虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区中类静态属性引用的对象,方法区中常量引用的对象,所有被同步锁持有的对象?标记-清除算法就,标出来的留着。剩下的回收。效率不高,会导致内存空间不连续。标记-复制算法,一半一半的使用内存空间,把左边存活的都挪到右边,然后把左边清空。标记-整理算法,把留下的挨个排好,剩下的内存区域清空。针对老年代。分代收集算法,分成新生代老生代选择不同算法。步骤:新生代分为eden区,s0(from),s1(to)区。分配比例是8:1:1,可通过参数动态调整。对象首先在eden区分配(如果太大就直接在老年代分配)。当新生代空间不够时,发起minorGC。在一次新生代垃圾回收后,如果对象还存活,年龄+1并进入survivor区,当年龄达到阈值(有的默认15,为什么是15,因为记录年龄的字段只有4位,CMS默认6)会进入老生代。经过一次minorGC后,eden区和from区已经被清空,to区可能有对象存活,然后交换from和to。等to区被填满,所有对象移动到老生代中。动态年龄计算:hotspot遍历所有对象,按照年龄大小对其所占用的大小进行累计,累计到survivor区的一半时,取这个年龄MaxTenuringThreshold中更小的值作为新的晋升年龄。fullGC:当统计数据说youngGC之前晋升的平均大小比目前oldGen剩余空间大,则会触发FullGC,收集整个java堆和方法区。收集器:serial,仅使用一个线程去收集。收集的时候暂停其他所有工作线程。新生代标记复制,老年代标记整理。没有线程交互的开销,简单高效。Parnew,多线程版本的serial。收集的时候暂停其他所有工作线程。新生代标记复制,老年代标记整理。parallel scanvage,和parnew几乎一样
关注吞吐量:cpu中用于运行用户代码时间与总消耗时间的比值。serial old,parallel old,cms,concurrent mark sweep 追求最短停顿时间,基本实现垃圾收集线程和用户线程同时工作。
标记-清除
初始标记:极短。暂停所有线程,标记可达对象对象。
并发标记:长。开启用户线程,记录可达对象和用户线程这段时间发生的引用更新。
重新标记:短。暂停所有线程。处理并发标记期间的引用更新。
并发清除:开启用户线程,清扫未标记的区域。?并发清除阶段发生的引用更新怎么办
g1收集器
针对多核大内存机器,停顿低吞吐高。
充分利用多核,和用户线程并行。
分代
整体看标记整理,部分看标记复制。
停顿时间可预测
维护优先列表,根据收集时间,优先选择回收价值最大的region回收。名字garbage first的由来。
zgc收集器
标记-复制算法,停顿时间更少

你可能感兴趣的:(java)