此处记录一些java面试常常考察的知识点,方面自己复习,如果有不对的地方欢迎指正.
1.JVM内存模型:
分为程序计数器,java虚拟机栈,本地方法栈,java堆,方法区.
Java1.7时候讲常量池从方法区移到了java堆(原因是因为方法区内存大小固定,容易产生内存溢出),1.8的时候取消了方法区,改为元空间,存在本地内存区域,和堆独立.
2.类加载:
a.加载:获取定义此类的二进制字节流
b.验证: 文件格式验证,元数据验证,字节码验证以及符号引用验证。
c.准备: 为类变量分配内存并设置初始值
d.解析: 解析时虚拟机将常量池中的符号引用替换为直接引用的过程。
e.初始化:(4种情况)
1)当使用new关键字实例化对象时,当读取或者设置一个类的静态字段(被final修饰的除外)时,以及当调用一个类的静态 方法时(比如构造方法就是静态方法),如果类未初始化,则需先初始化。
2)通过反射机制对类进行调用时,如果类未初始化,则需先初始化。
3)当初始化一个类时,如果其父类未初始化,先初始化父类。
4)用户指定的执行主类(含main方法的那个类)在虚拟机启动时会先被初始化。
3.java内存模型(JMM):
定义了一个线程对另一个线程可见。共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据时,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。
4.gc:
大多数的刚创建的对象会被分在Eden区(大多数很快就会消亡),Eden区满了以后,进行一次Minor GC,仍然存活下来的对象复制到存活区From(两个Survivor区必定一个是空的)
下次Eden区满了,再执行一次Minor GC,将消亡的对象清理掉,将存活的对象复制到TO 中,然后清空Eden区同时也 将From 中消亡的对象清理掉,将存活的对象也复制到TO 区,然后清空From区;之后,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。
默认切换15次(MaxTenuringThreshold)后,仍然存货的对象复制到老年代.
当老年代空间不足的时候,会触发Full GC,速度一般比Minor GC慢10倍以上.
永久代(方法区): XX:MaxPermSize进行设置
5.hashmap源码:
a.有一个叫做 Entry内部类,用来存放key-value对
b.Entry存在叫做table的数组中
c.table的索引在逻辑上叫做”桶”,它存储链表上的第一个元素
d.key的hashcode()方法用来找到Entry对象所在的桶
e.key的equal()方法保证key的唯一性
f.value的hashcode()方法和equal()方法没有用.
6.concurrenthashmap源码:
Node数组+链表+红黑树实现
CAS算法+synchronized保证线程安全
jdk1.8以后的结构和hashmap类似
7.线程
a.进程是资源分配的一个独立单元,线程是CPU调度的基本单元
b.一个进程可以有很多个线程,并且线程共享整个进程的资源,一个进程至少包括一个线程
c.进程创建调用fork或者vfork,线程创建调用pthread_create,进程结束会销毁它的所有线程,线程结束不影响同进程中的其他线程
d.线程是轻量级的进程
e.线程中执行时一般要进行同步和互斥
8.线程池源码
重要参数:
execute源码:
9.数据结构:
10.排序
11.树(B树,B+树)
先序中序后序排列算法:
详见idea
B树与B+树的区别:
B+树的有点:
B树的优点:
对于内部结点,可以直接得到,二不必根据叶子结点定位
12.堆
13.数据库
14.ACID
15.索引源码
在MySQL中,不同存储引擎对索引的实现方式是不同的
MyISAM引擎索引实现:(非聚集索引)
InnoDB引擎索引实现:(聚集索引)
因为所有辅助索引都引用主索引,所以主索引的字段不宜过长
索引优化:
16.锁机制
锁的分类(oracle)
一、按操作划分,可分为DML锁、DDL锁
二、按锁的粒度划分,可分为表级锁、行级锁、页级锁(mysql)
三、按锁级别划分,可分为共享锁、排他锁
四、按加锁方式划分,可分为自动锁、显示锁
五、按使用方式划分,可分为乐观锁、悲观锁
表级锁(整张表加锁),行级锁(当前行加锁,行级锁基于索引),页级锁
MySQL:
MyISAM和MEMORY采用表级锁(table-level locking)
BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
17.数据库三范式
第一范式:数据库字段具有原子性,不可再分
第二范式:每个实例或行可被唯一确定,即有主键
第三范式:这条记录中的其他字段和主键都有直接关系
18.网络
a.https是添加了加密和认证机制的http,是http+SSL的结合体
b.tcp与udp区别:
19.tcp
三次握手四次挥手:
第一次握手:SYN=1(表示请求),seq=x
第二次握手:ACK=1(确认序号有效),SYN=1(表示请求),seq=y,ack=x+1(确认序号)
第三次握手:ACK=1,seq=x+1,ack=y+1
第一次挥手:FIN=1(释放一个连接),seq=u
第二次挥手:ACK=1,ack=u+1,seq=v
第三次挥手:FIN=1,ACK=1,seq=w,ack=u+1
第四次挥手:ACK=1,seq=u+1,ack=w+1
20.https与http:
一次完整的http请求:
首先域名解析(浏览器DNS缓存找,系统DNS缓存找,找不到向配置的DNS服务器地址发送域名解析请求)
然后发起tcp请求,就是三次握手
发起http请求
服务器相应,浏览器接受返回的html代码,然后解析代码,渲染页面
https连接过程:
21. spring
a.IOC
b.AOP
22.mybatis
23.数据库设计
24.分布式
25.中间件