今天面试网易,凉得一批,总结一下,分享给大家,一些没答案的自己找吧o(╥﹏╥)o,大家加油吧!!!!
1、Java内存模型
1、程序执行过程:
调用自身的findLoadedClass()去内存中寻找这个类,然后通过AppClassLoader,如果找不到
则会调用其父类加载器 即ExtClassLoader同样去内存中寻找,如果找不到则会再通过父类加载器即BootStrap来寻找,如果都没有找到则会一层一层返回,即BootStrap通过它自身定义的加载路径加载,如果加载不到则会通过ExtClassLoader根据自身定义的加载路径加载,如果加载不到则会通过AppClassLoader加载。如果都加载不到,会报出ClassNotFund异常。
2、java执行流程:
.java 经过编译器 .class JVM中的类加载器加载各个类的字节码文件由JVM执行引擎执行。
运行时数据区
虚拟机栈、堆、方法区、程序计数器、本地方法栈
3、Java自带四种线程池:
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个固定线程数的线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个固定个数的线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单个线程的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
4、cms垃圾收集器 垃圾回收做了什么,和G1对比
G1垃圾回收相比较CMS可能最主要的差别,是增加了 碎片整理 这一点,并且在回收的同时进行碎片整理,垃圾回收的效率更高一些
Java栈也是线程私有的,每个方法被执行的时候会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。
堆与栈的区别:
1.栈内存存储的是局部变量而堆内存存储的是实体;
2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
5、jvm的一些工具,如何检测内存泄露
jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到 当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。
jconsole – jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java 程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
jinfo – jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。
jmap – jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。
jdb – jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。
jstat – jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。
jps – jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。
6、jvm 类加载的全过程每一步做什么
双亲委派模型,在该模型中,子类加载器收到的加载请求,不会先去处理,而是先把请求委派给父类加载器处理,当父类加载器处理不了时再返回给子类加载器加载;
7、设计模式的理解
创建型
0. 简单工厂(不算模式):
1. 工厂模式:由子类决定要创建的具体类是哪一个
2. 抽象工厂模式:允许客户创建对象的家族,而无需指定他们的具体类
3. 单例模式:确保有且只有一个对象被创建
4. 原型模式:clone, 深拷贝,浅拷贝
5. 建造者模式:隐藏具体的建造过程及细节
结构型
1. 适配器模式:封装对象,并提供不同的接口
2. 装饰者模式:给对象附加不同的责任或功能
3. 外观模式:简化一群类的接口
4. 组合模式:客户用一致的方式处理对象集合和单个对象
5. 桥接模式:抽象与实现分离以实现不同的
6. 代理模式:你的经纪人
7. 享元模式:共享技术,支持大量细粒度的对象
行为型
1. 策略模式:封装可以互换的行为,并使用委托来决定要使用哪一个。
2. 观察者模式:让对象能够在状态改变时被通知
3. 模板方法模式:由子类决定如何实现一个算法中的步骤
4. 命令模式:封装请求成为对象
5. 状态模式:封装了基于状态的行为,并使用委托在行为之间切换
6. 迭代器模式:在对象的集合之间游走,而不暴露集合的实现
7. 责任链模式:和链表有点像,每个责任者都保存了要设置的下一个处理对象的指针或引用
8. 中介者模式:联合国,处理各国纠纷
9. 解释器模式:编译器
10. 备忘录模式: 游戏存档
11. 访问者模式:最复杂的模式,适用于数据结构相对稳定的系统
8、单例模式怎么解决高并发的问题
可以采用双检锁 (读写锁)
2、Java集合、多线程等
1、死锁产生的条件,java程序可以自己解决死锁吗
典型的避免死锁的算法:银行家算法
1.互斥条件
2.请求与保持条件
3.不可剥夺条件
4.循环等待条件
不行
2、hashcode 和 equal
两个obj,如果equals()相等,hashCode()一定相等。
两个obj,如果hashCode()相等,equals()不一定相等(Hash散列值有冲突的情况,虽然概率很低)。
3、sleep wait 和 notify
sleep方法并不会释放锁
wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,
notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争
4、hashtable的实现
5、线程安全的有哪些,jdk不设置同步的线程安全的有哪些
线程安全类
vector:比arraylist多了个同步化机制(线程安全)
statck:堆栈类,先进后出
hashtable:就比hashmap多了个线程安全
enumeration:枚举,相当于迭代器
6、Error和Exception的区别
Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。
Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。
7、IOException和NPE各属于什么异常,是否需要运行才能报异常,为什么这么设置
8、一致性hash算法
10、线程interrupt和stop方法区别
3、Spring
1、Spring控制反转和依赖注入到底做了什么
IOC是指将对象交给spring容器管理,只需在spring配置文件中配置相应的bean及相关的属性,让spring容器来创建类的实例对象以及管理对象。在spring容器启动的时会把配置文件中配置的bean初始化,当你需要调用的时候,spring将初始化好的那些bean 分配给 你需要调用这些bean的类。
将相同逻辑的重复代码横向抽取出来,使用动态代理技术将这些重复代码织入到目标对象方法中,实现和原来一样的功能。写业务时只关心业务代码,而不用关心与业务无关的代码,降低了模块间的耦合度,同时提高了系统的可维护性。
2、Spring的事务传播机制
PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。
PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常
PROPAGATION_NESTED如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
3、SpringAOP用过吗,异常处理器,怎么实现的?
controller 增强 声明切面类
4、Spring 过滤器 、拦截器、监听器的访问顺序
监听器-->过滤器-->拦截器
4、数据库
1、索引原理
InnoDB 使用的是聚簇索引, 将主键组织到一棵 B+树中, 而行数据就储存在叶子节点上, 若使用"where id = 14"这样的条件查找主键, 则按照 B+树的检索算法即可查找到对应的叶节点, 之后获得行数据。 若对 Name 列进行条件搜索, 则需要两个步骤:
第一步在辅助索引 B+树中检索 Name, 到达其叶子节点获取对应的主键。
第二步使用主键在主索引 B+树种再执行一次 B+树检索操作, 最终到达叶子节点即可获取整行数据。
MyISM 使用的是非聚簇索引, 非聚簇索引的两棵 B+树看上去没什么不同, 节点
的结构完全一致只是存储的内容不同而已, 主键索引 B+树的节点存储了主键, 辅助键索引B+树存储了辅助键。 表数据存储在独立的地方, 这两颗 B+树的叶子节点都使用一个地址指向真正的表数据, 对于表数据来说, 这两个键没有任何差别。 由于索引树是独立的, 通过辅助键检索无需访问主键的索引树。
2、InnoDB的索引机制,隔离级别怎么实现的
3、Mysql死锁如何解决
(1)终止(或撤销)进程。终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解除出来。
(2)抢占资源。从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以打破死锁状态。
4、数据库索引实现机制,索引的最左匹配原则
5、Redis
1、redis是怎么实现分布式锁的
在进程请求执行操作前进行判断,加锁是否成功,加锁成功允许执行下步操作;
如果不成功,则判断锁的值(时间戳)是否大于当前时间,如果大于当前时间,则获取锁失败不允许执行下步操作;
如果锁的值(时间戳)小于当前时间,并且GETSET命令获取到的锁的旧值依然小于当前时间,则获取锁成功允许执行下步操作;
如果锁的值(时间戳)小于当前时间,并且GETSET命令获取到的锁的旧值大于当前时间,则获取锁失败不允许执行下步操作;
2、redis淘汰策略
定时删除
惰性删除
定期删除
3、no sql的原则:CAP
4、redis为什么是单线程的
5、redis持久化的方式有哪几种,redis服务down机怎么保证数据一致性
6、分布式
1、DDB了解过没,均衡字段是干啥的
网易分库分表数据库DDB
分库分表的原理是将数据按照一定的分区规则Sharding到不同的关系型数据库中,应用再通过中间件的方式访问各个Shard中的数据。分库分表的中间件,隐藏了数据Sharding和路由访问的各项细节,使应用大多数场景下可以像使用单机数据库一样使用分库分表后的分布式数据库。
2、dubbo了解过吗,能说一下他都做了些什么吗?(网上有个10层的图)
3、分布式事务怎么实现的
1、消息队列
2、TCC补偿 try confirm cannel
推荐几个比较不错的分布式事务框架框架:ByteTCC,TCC-transaction,Himly。
4、两段式提交机制是强一致性还是最终一致性,为什么
最终一致性
可以把一个分布式的事物划分为多个独立的事物,两端提交。用消息队列做写入缓冲,用二端提交和串联的transaction做事务处理,接口做幂等,在出现commit异常的情况下,采用事务补偿,也就是说,先假设事务成功的概率是99%以上,然后检查最终一致性,最后针对出错的不到1%做事务补偿。提供补偿机制;
5、zookeeper原理了解过吗
7、其他
1、CAS,其中出现ABA问题怎么解决
解决ABA最简单的方案就是给值加一个修改版本号,每次值变化,都会修改它版本号,CAS操作时都对比此版本号。
2、maven如何解决包冲突
Maven 解析 pom.xml 文件时,同一个 jar 包只会保留一个,这样有效的避免因引入两个 jar 包导致的工程运行不稳定性。
最短路径优先
最先声明优先
3、git中 rebase 和 merge的区别
4、http长连接和短连接
5、TCP四次握手,为什么是四次握手,几种状态讲一下吧
6、jdk8的新特性,如果在jdk7中要实现lambda表达式,你会怎么实现
7、Session和cookie的区别,如果浏览器禁用了cookie怎么解决
解决方案:URL重写
•response. encodeRedirectURL(java.lang.String url)
•用于对sendRedirect方法后的url地址进行重写。
•response. encodeURL(java.lang.String url)
•用于对表单action和超链接的url地址进行重写
Springboot核心注解
1、@SpringBootApplication
用来开启 Spring Boot 的各项能力
其实这个注解就是 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan 这三个注解的组合,也可以用这三个注解来代替 @SpringBootApplication注解。
2、@EnableAutoConfiguration
允许 Spring Boot 自动配置注解
3、@Configuration
用来代替 applicationContext.xml 配置文件,所有这个配置文件里面能做到的事情都可以通过这个注解所在类来进行注册。
4、@SpringBootConfiguration
用来修饰 Spring Boot 配置,可利于 Spring Boot 后续的扩展。
5、@ComponentScan
代替配置文件中的 component-scan 配置,开启组件扫描,即自动扫描包路径下的 @Component 注解进行注册 bean 实例到 context 中。
6、@Conditional
来标识一个 Spring Bean 或者 Configuration 配置文件,当满足指定的条件才开启配置。
7、@ConditionalOnBean
组合 @Conditional 注解,当容器中有指定的 Bean 才开启配置。
8、@ConditionalOnMissingBean
组合 @Conditional 注解,和 @ConditionalOnBean 注解相反,当容器中没有指定的 Bean 才开启配置。
9、@ConditionalOnClass
组合 @Conditional 注解,当容器中有指定的 Class 才开启配置。
10、@ConditionalOnMissingClass
组合 @Conditional 注解,和 @ConditionalOnMissingClass 注解相反,当容器中没有指定的 Class 才开启配置。
11、@ConditionalOnWebApplication
组合 @Conditional 注解,当前项目类型是 WEB 项目才开启配置。
12、@ConditionalOnNotWebApplication
组合 @Conditional 注解,和 @ConditionalOnWebApplication 注解相反,当前项目类型不是 WEB 项目才开启配置。
13、@ConditionalOnProperty
组合 @Conditional 注解,当指定的属性有指定的值时才开启配置。
14、@ConditionalOnExpression
组合 @Conditional 注解,当 SpEL 表达式为 true 时才开启配置。
15、@ConditionalOnJava
组合 @Conditional 注解,当运行的 Java JVM 在指定的版本范围时才开启配置。
16、@ConditionalOnResource
组合 @Conditional 注解,当类路径下有指定的资源才开启配置。
17、@ConditionalOnJndi
组合 @Conditional 注解,当指定的 JNDI 存在时才开启配置。
18、@ConditionalOnCloudPlatform
组合 @Conditional 注解,当指定的云平台激活时才开启配置。
19、@ConditionalOnSingleCandidate
组合 @Conditional 注解,当指定的 class 在容器中只有一个 Bean,或者同时有多个但为首选时才开启配置。
20、@ConfigurationProperties
用来加载额外的配置(如 .properties 文件),可用在 @Configuration 注解类,或者 @Bean注解方法上面。
21、@EnableConfigurationProperties
一般要配合 @ConfigurationProperties 注解使用,用来开启对 @ConfigurationProperties注解配置 Bean 的支持。
22、@AutoConfigureAfter
用在自动配置类上面,表示该自动配置类需要在另外指定的自动配置类配置完之后。
23、@AutoConfigureBefore
这个和 @AutoConfigureAfter 注解使用相反,表示该自动配置类需要在另外指定的自动配置类配置之前。
24、@Import
这是 Spring 3.0 添加的新注解,用来导入一个或者多个 @Configuration 注解修饰的类,这在 Spring Boot 里面应用很多。
25、@ImportResource
这是 Spring 3.0 添加的新注解,用来导入一个或者多个 Spring 配置文件,这对 Spring Boot 兼容老项目非常有用,因为有些配置无法通过 Java Config 的形式来配置就只能用这个注解来导入。
https://blog.csdn.net/zl1zl2zl3/article/details/83715633