前言
就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。
面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。
Java面试的重点:
数据结构与算法,JVM内存结构、垃圾回收器、回收算法、GC、并发编程相关(多线程、线程池等)、NIO/BIO、性能优化、设计模式、Spring框架:分布式相关:Redis缓存、一致Hash算法、分布式存储、负载均衡等,微服务以及Docker容器等。
因为头条篇幅原因,不能给大家一个全面的解析,末尾小编会分享一个Java基础到架构面试文档,希望能帮助到正在努力的朋友。
JVM解析
1、垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中-一个显著的特点就是引入了垃圾回收机制,使C++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java 中的对象不再有“作用域”的概念,只有对象的引用才有"作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
2、什么是类加载器,类加载器有哪些?
实现通过类的权限定名获取该类的二进制字节流的代码块叫做类加载器。主要有一下四种类加载器:
- 启动类加载器(BootstrapClassL oader)用来加载Java核心类库,无法被Java程序直接引用。
- 扩展类加载器(extensions class loader):它用来加载Java的扩展库。Java虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载Java类。
- 系统类加载器(system class loader):它根据Java应用的类路径
- (CL ASSPATH)来加载Java类。-般来说,Java 应用的类都是由它来完成加载的。可以通过Classl oader.getSystemClassl _oader()来获取它。
- 用户自定义类加载器,通过继承java.lang.ClassL oader类的方式实现。
3、java内存分配
- 寄存器:我们无法控制。
- 静态域:| static 定义的静态成员。
- 常量池:编译时被确定并保存在. class文件中的(final) 常量值和-些文本修饰的符号引用(类和接口的全限定名,字段的名称和描述符,方法和名称和描述符)。
- 非RAM存储:硬盘等永久存储空间。
- 堆内存: new创建的对象和数组,由Java 虚拟机自动垃圾回收器管理,存取速度慢。
- 栈内存:基本类型的变量和对象的引用变量(堆内存空间的访问地址),速度快,可以共享,但是大小与生存期必须确定,缺乏灵活性。1.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Genspace) ?
JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。-直到垃圾收集器把这些对象回收掉之前,他们会一直 占据堆内存空间。
更多解析
![8c936086541d43363f06d001444ecdf1.png](https://i-blog.csdnimg.cn/blog_migrate/b54675941cbb8d4a22d1f8d042e09ca8.jpeg)
Spring解析
1、怎样用注解的方式配置Spring?
Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同-个属性的处理结果。
注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。如果你想要在你的应用程序中使用关于注解的方法的话,请参考如下的配置。
![916a2027d3f12829ac460bbbc24f50b4.png](https://i-blog.csdnimg.cn/blog_migrate/35356eb9f6a030123119dcfc93dc710a.jpeg)
在标签配置完成以后,就可以用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。下面是几种比较重要的注解类型:
- @Required:该注解应用于设值方法。
- @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。
- @Qulfier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。
- JSR. 250 Annotations:Spring支持基于JSR-250注解的以下注解,@Resource、@PostConstruct 和@PreDestroy。
更多解析
![2ae20950eaa047591b8fbd45e5de3ddd.png](https://i-blog.csdnimg.cn/blog_migrate/74186af93872965b1da827648cd3fb26.jpeg)
分布式解析
1、四种类型的znode
1、| PERSISTENT- 持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2、| PERSISTENT SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3、1 EPHEMERAL- 临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4、EPHEMERAL SEQUENTIAL-临时顺序编号目录节点.
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
![ab538439c35cd6e745c0b8cd3d6d2b79.png](https://i-blog.csdnimg.cn/blog_migrate/f10513e0083536f196a823b743ff6960.jpeg)
2、获取分布式流程
![9b9a002804441d8d2462f4078f8b3167.png](https://i-blog.csdnimg.cn/blog_migrate/862f8973a272cd33cfe21b0072c706cd.jpeg)
在获取分布式锁的时候在locker 节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker 下创建临时顺序节点,
然后调用gethildren("locker")来获取locker下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点path之后,如果发现自己创建的节点在所有创建的子节点序号最小,那么就认为该客户端获取到了锁。如果发现自己创建的节点并非locker所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,然后对其调用exist()方法,同时对其注册事件监听器。之后,让这个被关注的节点删除,则客户端的Watcher会收到相应通知,此时再次判断自己创建的节点是否是locker子节点中序号最小的,如果是则获取到了锁,如果不是则重复以上步骤继续获取到比自己小的一一个节点并注册监听。当前这个过程中还需要许多的逻辑判断。
![81af89e340e62cbaedab860ae3b4ab45.png](https://i-blog.csdnimg.cn/blog_migrate/967cf6f322dc83e8e849f930ca6b643a.jpeg)
更多 解析
![3e22331f6878ef4e84e5e0de225138e9.png](https://i-blog.csdnimg.cn/blog_migrate/b4080e86341b50ed74293e92910dbb61.jpeg)
解析tomcat
文章资料都整理在一个文档里面了,近500道面试题,需要的朋友可以私信"面试”获取哟
1、tomcat中如何禁止列目录下的文件
在{tomcat_ home}/ conf/web. xml中,把listings参 数设置成false即可,
如下:
![8e690db9f70396c091df74303bc7b1da.png](https://i-blog.csdnimg.cn/blog_migrate/0962df75d82d1b8b01188f6ed331bc20.jpeg)
2、Tomcat有几种部署方式tomcat中四种部署项目方法
第一种方法:
在tomcat中的conf目录中,在server. xml中的, 节点中添加:
![fb18228409799a731ead5ed4e9557e1a.png](https://i-blog.csdnimg.cn/blog_migrate/03c310988cd0e49c0faf0e182dee3c10.jpeg)
![7f299d1eee4bb04a1cfd1de1b12e733e.png](https://i-blog.csdnimg.cn/blog_migrate/f422284244be1d51470e461f237c8a34.jpeg)
至于Context节点属性,可详细见相关文档。第二种方法:
将web项目文件件拷贝到webapps目录中。
第三种方法:
很灵活,在conf目录中,新建Catalina (注意大小写)
| locathost目录,在该目录中新建一一个xml文件, 名字可以随意取,只要和当前文件中的文件名不重复就行了,该xml文件的内容为:
![7b553c5d7b70df7658a52968d2dfc28c.png](https://i-blog.csdnimg.cn/blog_migrate/3a1e42035541d6b243aa712cd1cd8c73.jpeg)
第3个方法有个优点,可以定义别名。服务器端运行的项目名称为path,外部访问的URL则使用XML的文件名。这个方法很方便的隐藏了项目的名称,对一些项目名称被固定不能更换,但外部访问时又想换个路径,非常有效。
第2、3还有优点,可以定义一些个性配置,如数据源的配置等。
第四种办法: 可以用tomcat在线后台管理器,-般tomcat都打开了,直接上传war就可以
更多解析
![a59d0b23105397aadfa833e7c5fbd2ed.png](https://i-blog.csdnimg.cn/blog_migrate/f8ce638ca6bfbde6d778f38ae1281456.jpeg)
MyBatis解析
1、Mybatis 是如何进行分页的?分页插件的原理是什么?
- Mybatis使用RowBounds对象进行分页,也可以直接编写sql现分页,也可以使用Mybatis的分页插件。
- 分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。举例:
![4c0649a4d329930196db1ba5cb06ce5c.png](https://i-blog.csdnimg.cn/blog_migrate/5792e2dfcece10d7ba0b548e83af2dc1.jpeg)
拦截sql后重写为;
![3a0d0f7f379e3302a74b78a41eb14577.png](https://i-blog.csdnimg.cn/blog_migrate/305620c600a28070b42c572f87cbe84c.jpeg)
2、MyBatis 的好处是什么?
- MyBatis把sql语句从Java源程序中独立出来,放在单独的XML文件中编写,给程序的维护带来了很大便利。
- MyBatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,大大简化了Java数据库编程的重复工作。
- 因为MyBatis需要程序员自己去编写sql语句,程序员可以结合数据库自身的特点灵活控制sql语句,因此能够实现比Hibernate 等全自动orm框架更高的查询效率,能够完成复杂查询。
更多解析
![d5ce394472fc00280b5d7bed5ea17218.png](https://i-blog.csdnimg.cn/blog_migrate/dd890dc321f7be4f5e7e58926da02fca.jpeg)
最后
关注小编+转发文章+私信【面试】免费获取这个500面试题的PDF资料哟!
还有更多资料包含Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。相信对于已经工作和遇到技术瓶颈的码友,在这里会有你需要的内容。