重载:一个方法多个签名。重写:子类重新实现父类的方法。多态性:子类或父类中的方法是否被调用只能在运行时判断。Stringbuffer是线程安全的,但stringbuilder不是。代理模式:代理对象代替真实对象,不修改原对象提供附加功能。静态代理、动态代理、jdk动态代理、cglib动态代理。IO:用户空间,内核空间。Bio:同步阻塞,在线等,读取,返回。NIO:同步非阻塞:反复询问。io多路复用:select,notifymewhenready,ready,read,return。AIO:异步:回调。Arraylist:线程不安全,底层是数组,末尾有空闲空间,randomAcess,末尾增删O(1),中间增删O(n),当JDK7new没有参数arrayList,直接创建一个10长的Object[]数组elementData,单例Hungry风格,类加载时初始化,jdk8lazy风格,只在第一次调用时初始化。插入扩展过程:1.检查插入位置的合法性,2.判断剩余空间是否足够大,3.移动位置到邻居,4.插入,大小增加。如果空间不够,则将位运算扩展为max(10,1.5timesn)。hashMap:非线程安全,初始容量16(快速定位柱面),负载因子0.75,zipper方式(树)解决hash冲突,扩容:每次扩容翻倍,1计算新的容量和新的阈值,创建一个新的array,node映射到一个新数组,如果有树要分裂。内存管理:堆、线程共享、新建对象和数组、gc区。虚拟机(本地方法)栈:线程私有,本地变量表(基本数据类型,对象引用地址)。程序计数器:循环。方法区:线程共享、加载的类信息(构造函数、字段方法)、常量、静态变量、运行时常量池(1.7移到堆中)。IOC:让spring框架创建对象,简化开发,不需要搞清楚底层的类构造函数。AOP:基于动态代理。gc:如何判断一个对象是否死了,引用计数法,可达性分析算法,Gcroot,虚拟机栈中引用的对象,本地方法栈中引用的对象,方法区中类静态属性引用的对象,常量中方法区引用的对象,同步锁持有的所有对象?mark-sweep算法就是这样,有标记的就保留。回收其余部分。效率不高,内存空间会不连续。mark-copy算法使用一半一半的内存空间,把剩下的全部向右移动,然后清空左边。mark-sorting算法将剩余的一个一个排列,并清除剩余的内存区域。为晚年。分代收集算法,分为新生代和老年代选择不同的算法。步骤:新生代分为eden区,s0(from),s1(to)区。分配比例为8:1:1,可通过参数动态调整。对象先分配在eden区(如果太大,直接分配在old区)。当新生代空间不足时,会发起minorGC。新生代一次垃圾回收后,如果对象还活着,则年龄+1,进入幸存者区。当age达到阈值(有的默认是15,为什么是15,因为记录age的字段只有4位,而CMS默认是6位)就会进入oldgeneration。一次minorGC后,eden区和from区已经清空,to区可能还有对象存活,然后交换from和to。当to区域被填满时,所有的对象都被移动到老年代。动态年龄计算:hotspot遍历所有对象,根据年龄累加其占用的大小。当累加到survivorarea的一半时,取这个ageMaxTenuringThreshold中较小的值作为新的晋升age。fullGC:当统计显示youngGC提升的平均大小大于当前oldGen剩余空间时,将触发FullGC收集整个java堆和方法区。Collector:串行的,只用一个线程来收集。收集时暂停所有其他工作线程。复制新生代标记,对老年代标记进行排序。没有线程交互的开销,简单高效。Parnew,串行的多线程版本。收集时暂停所有其他工作线程。复制新生代标记,对老年代标记进行排序。parallelscanvage几乎和parnew一样关注吞吐量:在cpu中运行用户代码的时间占总消耗时间的比例。serialold,parallelold,cms,concurrentmarksweep追求停顿时间最短,基本实现垃圾回收线程和用户线程同时工作。标记清晰的初始标记:极短。挂起所有线程,标记可达对象。并发标记:长。启动用户线程,记录这段时间内可达对象和用户线程的引用更新。重新标记:简短。暂停所有线程。在并发标记期间处理引用更新。并发清理:启动用户线程清理未标记区域。?如何处理在并发清算阶段发生的参考更新。g1收集器针对多核大内存机器,具有低停顿和高吞吐量。充分利用多核,与用户线程并行。全代看标记排列,部分看标记文案。暂停时间可以预测维护优先级列表。根据采集时间,优先选择恢复值最高的区域进行恢复。先说垃圾名字的由来。zgc收集器mark-copy算法,停顿时间少
