面试总结理论,持续更新

spring的加载原理

1.无论是ClassPathXmlApplicationContext 还是 XmlWebApplicationContext都extend抽象类.AbstractApplicationContext 
2.通过抽象类中的obtainFreshBeanFactory方法来构造 beanFactory 
3.抽象类中的实现AbstractBeanDefinitionReader.loadBeanDefinitions(Resources []) 循环Resource数组,调用DefaultBeanDefinitionDocumentReader 其实就是要真正开始解析XML

4.解析XML的信息,跟踪进去 NamespaceHandlerSupport 的parse 的类BeanDefinitionParser

5.里面有ClassPathBeanDefinitionScanner 来扫描类文件。

6.值得注意的是classpath*:com/abc/**/*.class加载类的路径。

mybatis 的优缺点。

1.1)单小巧易用上手,方便浏览修改sql就是它最大的优点。

   2)运行速度,hibernate是在jdbc上进行了一次封装,而mybatis基于原生的jdbc,因此mybatis天生就有运行速度上的优势。

   3)mybatis可以很容易做到不规范的映射对象和规范的映射对象共存

   4)Hibernate理念不错,完全的ORMapping,MyBatis只是个SQL Mapper

   5)mybatis会有更强的掌控度,你可以控制sql,而不是hibernate那样使用hsql。你几乎无法预知生成的真正sql是什么样,多么烂。。
这个优点前期并不明显,尤其是表少,表关联少,数据量少的时候,因此这个阶段hibernate会更方便,但是一点复杂度到了一定程度,
那mybatis的优越性就就来了,自己写sql,可控度非常高。效率也不会因为无法预计的sql而被拉低(不排除人为因素)。

2..差异比较大的是关联查询时,hibernate为了保证POJO的数据完整性,需要将关联的数据加载,需要额外地查询更多的数据。这里hibernate并没有提供相应的灵活性。

3. mybatis提供xml标签,支持编写动态sql。

4.mybatis的sql写在xml里,便于统一管理和优化。

5.sql工作量很大,尤其是字段多、关联表多时,更是如此,编写动态sql时,不方便调试,尤其逻辑复杂时,可读性差。


mysql的优化


1)EXPLAIN 将获取查询的索引

EXPLAIN

SELECT *
FROM LOG.mycis_trans_log t1
WHERE date_format(entry_datetime, '%Y%m%d') >= '20170120'
        AND date_format(entry_datetime, '%Y%m%d') < '20170224'
        AND resource_id = 'apVoidCheck'
        and local_company <> 0

2)尽量避免SELECT *命令

3)建立有效的索引

4)利用LIMIT 1取得唯一行

5)保证连接的索引是相同的类型,不要用索引字段上加函数,否则可能不能用。

6)拆分大的 DELETE 或 INSERT 语句。

索引:

1)左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的。

2)尽量选择区分度高的列作为索引,例如主键做索引。

3)索引列不能参与计算

4)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。


jvm GC 调试

JVM原理

1.JVM 其实是一种抽象的机器,安装在操作系统之上,有完整的机器指令,并且拥有自己的栈,寄存器等。JVM提供了不同的硬件平台编译java技术代码的规范,该规范使得java独立于平台。

1)java 从编译到最终运行,首先是代码的装入。由类加载器class load。

2)代码的校验,由字节码验证器完成,以保证不违反java的安全性规则。

3)代码的执行,由运行时解释器完成。在字节码校验后,代码就可以执行了。


2.jvm加载:

1)  JVM加载,连接,初始化。

2)JAVA class的加载,Bootstrap ,Extension ,System ,User-Defined

3)JVM执行引擎

4)JVM运行时数据区

---3)4)也可以称为管理并分配内存

5)JVM垃圾回收


3.java 的内存分类,以及存贮的类型。

1)java栈的区域很小,只有1M,特点是存取速度很快,所以在stack中存放的都是快速执行的任务,

基本数据类型的数据,和对象的引用(reference)。

2)程序计数器(ProgramCounter)寄存器

PC寄存器( PC register ):每个线程启动的时候,都会创建一个PC(Program Counter,程序计数器)寄存器。PC寄存器里保存有当前正在执行的JVM指令地址。 每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。保存下一条将要执行的指令地址的寄存器是 :PC寄存器。PC寄存器的内容总是指向下一条将被执行指令的地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。

3)本地方法栈

Nativemethodstack(本地方法栈):保存native方法进入区域的地址。

4)

类的对象放在heap(堆)中,所有的类对象都是通过new方法创建,创建后,在stack(栈)会创建类对象的引用(内存地址)。

5)方法区

method(方法区)又叫静态区,存放所有的①类(class),②静态变量(static变量),③静态方法,④常量和⑤成员方法。

6)运行常量池

这儿的“静态”是指“位于固定位置”。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。

这个区域属于方法区。该区域存放类和接口的常量,除此之外,它还存放成员变量和成员方法的所有引用。当一个成员变量或者成员方法被引用的时候,JVM就通过运行常量池中的这些引用来查找成员变量成员方法内存中的的实际地址


Session和cookie区别


举例三种设计模式和运用场景。

1.工厂模式,sessionFactory
2.代理模式,面向切面,需要增加额外的方法。
3.观察者模式,监控方法。



高并发

设计方案,1、采用分布式应用设计2、分布式缓存 数据库 3、代码优化。
1)HTML静态化
2)图片服务器分离
3)3、数据库集群和库表散列
4、缓存
6、负载均衡

多线程


redis的原理

1)第一种方法filesnapshotting 默认redis是会以快照的形式将数据持久化到磁盘的(一个二进制文件,dump.rdb,这个文件名字可以指定),在配置文件中的格式是:save N M表示在N秒之内,redis至少发生M次修改则redis抓快照到磁盘。当然我们也可以手动执行save或者bgsave(异步)做快照
工作原理简单介绍一下:当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以 copy-on-write
2)还有一种持久化方法是Append-onlyfilesnapshotting方法在redis异常死掉时,最近的数据会丢失(丢失数据的多少视你save策略的配置),所以这是它最大的缺点,当业务量很大时,丢失的数据是很多的。Append-only方法可以做到全部数据不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中开启(默认是no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到redis关闭前的最后时刻。
AOF文件刷新的方式,有三种,参考配置参数appendfsync :appendfsync always每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全;appendfsync everysec每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据;appendfsync no依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾

dubbo

Dubbo的架构

节点角色说明:

·        Provider: 暴露服务的服务提供方(service服务层)。

·        Consumer: 调用远程服务的服务消费方(web表现层)。

·        Registry: 服务注册与发现的注册中心(zookeeper)。

·        Monitor: 统计服务的调用次调和调用时间的监控中心。

·        Container: 服务运行容器(tomcat容器,spring容器)。

调用关系说明:

·        0. 服务容器负责启动,加载,运行服务提供者。

·        1. 服务提供者在启动时,向注册中心注册自己提供的服务。

·        2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

·        3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

·        4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

·        5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

注册服务关系图解:

 

注册发布服务流程:

1)  服务容器启动(tomcat容器,spring容器)

2)  Service服务层项目发布服务

a)        Dubbo服务治理中间件把服务发布存储到Zookeeper注册中心

3)  Web层服务调用服务

a)        Dubbo服务治理中间件去Zookeeper注册中心获取服务。


1)dubbo的import的加载

            Class.forName("com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler");
            Class clz = Class.forName("org.springframework.context.support.ClassPathXmlApplicationContext");
            Constructor con = clz.getConstructor(new Class[]{String.class});
            context = con.newInstance(new Object[]{"classpath*:" + System.getProperty("dubbo.consumer.file", "dubbo-consumer-config.xml")});

MQ,

GIT

java集合类总结

hashmap的实现原理:

这里HashMap里面用到链式数据结构的一个概念。上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做: B.next = A ,Entry[0] = B,如果又进来C,index也等于0,那么 C.next = B ,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。 也就是说数组中存储的是最后插入的元素。 到这里为止,HashMap的大致实现,我们应该已经清楚了。

接口

特性

实现类

实现类特性

成员要求

List

线性、有序的存储容器,可通过索引访问元素

ArrayList

数组实现。非同步。查询快O(1),写入慢O(N),但是如果从数组末尾插入则效率高。

 

Vector

类似ArrayList,同步。

 

LinkedList

双向链表。非同步。

查询慢,写入快

实现了stack和queue的方法。

通过movefist实现stack和movelast实现queue

可以通过push,pop实现stack,先进后出

通过offer(value),pull()和实现queue,先进先出

 

Map

保存键值对成员

HashMap

基于哈希表的 Map 接口的实现,满足通用需求

任意Object对象,如果修改了equals方法,需同时修改hashCode方法

TreeMap

默认根据自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序

comparator 的是key的值,可以自定义输出结果从大到小。

默认会以按照树结构从小到大的顺序输出结果。

键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。

LinkedHashMap

类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序

与HashMap相同

IdentityHashMap

使用==取代equals()对“键值”进行比较的散列映射

成员通过==判断是否相等

WeakHashMap

弱键映射,允许释放映射所指向的对象

 

ConcurrentHashMap

线性安全的Map

 

Set

成员不能重复

HashSet

为快速查找设计的Set

元素必须定义hashCode()

TreeSet

保持次序的Set,底层为树结构

元素必须实现Comparable接口

LinkedHashSet

内部使用链表维护元素的顺序(插入的次序)

元素必须定义hashCode()






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值