各大公司后端开发面试题总结

2、Java内存模型:
Java虚拟机规范中将Java运行时数据分为六种。
1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的,为了线程切换后能回复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。
2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表存放着基本数据类型,还有对象的应用。
3.本地方法栈:跟虚拟机栈很像,不过它是为虚拟机使用到的Native方法服务。
4.Java堆:所有线程共享的一块内存区域,对象实例几乎都在这分配内存。
5.方法区:各个线程共享的区域,储存虚拟机加载的类信息,常量,静态变量,编译后的代码。
6.运行时常量池:代表运行时每个class文件中的常量表。包括几种常量:编译时的数字常量、方法或者域的引用。
友情链接:Java中JVM虚拟机详解
3、“你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”
在什么时候:
1.新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一个发生在新生代的minor GC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survivor区的内存。在某次GC过程中,如果发现仍然有放不下的对象,就将这些对象放入老年代内存里去。
2.大对象以及长期存活的对象直接进入老年区。
3.当每次执行minor GC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年代的老年对象的大小超过了老年区的剩余大小,那么执行一个Full GC以尽可能的获得老年区的空间。
对什么东西:从GC Roots搜索不到,而且经过一次标记清理之后仍没有复活的对象。
做什么:新生代:复制清理;老年代:标记-清除和标记-压缩算法;永久代:存放Java中的类和加载类的类加载器本身。
GC Roots都有哪些:1.虚拟机栈中的引用的对象 2.方法区中静态属性引用的对象,常量引用的对象 3.本地方法栈中JNI(即一般说的Native方法)引用的对象。
4、Synchronized
与Lock都是可重入锁,同一个线程再次进入同步代码的时候,可以使用自己已经获取到的锁。
Synchroized是悲观锁机制,独占锁。而Locks.ReentrantLock是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。ReentrantLock适用场景
某个线程在等待一个锁的控制权的这段时间需要中断
需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程,锁可以绑定多个条件。
具有公平锁功能,每个到来的线程都将排队等候。
happens-before
如果两个操作之间具有happens-before关系,那么前一个操作的结果就会对后面一个操作可见。
1.程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
2.监视器锁规则:对一个监视器锁的解锁,happens-before于随后对这个监视器锁的加锁。
3.volatile变量规则:对一个volatile域的写,happens-before与任意后续对这个volatile域的读。
4.传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
5.线程启动规则:Thread对象的start()方法happens-before于此线程的每一个动作。
Volatile和Synchronized四个不同点:
1 粒度不同,前者针对变量,后者锁对象和类
2 syn阻塞,volatile线程不阻塞
3 syn保证三大特性,volatile不保证原子性
4 syn编译器优化,volatile不优化,volatile具备两种特性:
1.保证此变量对所有线程的可见性,指一条线程修改了这个变量的值,新值对于其他线程来说是可见的,但并不是多线程安全的。
2.禁止指令重排序优化。
Volatile如何保证内存可见性
1.当写一个volatile变量时,JVM会把该线程对应的本地内存中的共享变量刷新到朱内存。
2.当读一个volatile变量时,JVM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。
同步:
就是一个任务的完成需要依赖另外一个任务,只有等待被依赖的任务完成后,依赖任务才能完成
异步:
不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,只要自己任务完成了就算完成了,被依赖的任务是否完成会通知回来。(异步的特点就是通知)。打电话和发短信来比喻同步和异步操作。
阻塞:
CPU停下来等一个慢的操作完成以后,才会接着完成其他的工作。
非阻塞:
非阻塞就是在这个慢的执行时,CPU去做其他工作,等这个慢的完成后,CPU才会接着完成后续的操作。
非阻塞会造成线程切换增加,增加CPU的使用时间能不能补偿系统的切换成本需要考虑。
CAS(Compare And Swap)无锁算法:
CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有三个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值修改为B,否则什么都不做。
线程池的作用:
在程序启动的时候就创建若干线程来响应处理,他们被称为线程池,里面的线程叫工作线程
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。
常用线程池:ExecutorService是主要的实现类,其中常用的有Executors.newSingleThreadPool(),newFixedThreadPool(),newcacheThreadPool(),newScheduledThreadPool()。
类加载器工作机制:
1.装载:将Java二进制代码导入jvm中,生成Class文件。
2.连接:a)校验:检查载入Class文件数据的正确性b)准备:给类的静态变量分配存储空间c)将符号引用转成直接引用
3:初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。
双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成 用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。
Redis数据结构:
String–字符串(key-value类型)
Hash–字典(hashmap)Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值
List–列表 实现消息队列
Set–集合 利用唯一性
Sorted Set–有序集合 可以进行排序 可以实现数据持久化
B+,B-,全文索引
Mysql的索引是一个数据结构,旨在使数据库高效的查找数据。
常用的数据结构是B+Tree,每个叶子节点不但存放了索引键的相关信息还增加了指向相邻叶子节点的指针,这样就形成了带有顺序访问指针的B+Tree,做这个优化的目的是提高不同区间访问的性能。
什么时候使用索引:
经常出现在groupby,orderby和distinc关键字后面的字段
经常与其他表进行连接的表,在连接字段上应该建立索引
经常出现在Where字句中的字段
经常出现用作查询的字段
Spring AOP应用场景
性能检测,访问控制,日志管理,事务等。
默认的策略是如果目标类实现接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理
分布式Session框架
配置服务器,Zookeeper集群管理服务器可以统一管理所有服务器的配置文件
共享这些Session存储在一个分布式缓存中,可以随时写入和读取,而且性能要很好,如Memcache,Tair。
封装一个类继承自HttpSession,将Session存入到这个类中然后再存入分布式缓存中
由于Cookie不能跨越访问,要实现Session同步,要同步SessionID写到不同域名下。
适配器模式:
将一个接口适配到另一个接口,Java I/O中InputStreamReader将Reader适配到InputStream,从而实现了字节流到字符流的转换。
装饰者模式
保持原来的接口,增强原来有的功能
FileInputStream实现了InputStream的所有接口,BufferdInputStreams继承自FileInputStream是具体的装饰器实现者,将InputStream读取的内容保存在内存中,而提高读取的性能。
Spring事务配置方法:
1.切点信息,用于定位实施事务切面的业务类方法
2.控制事务行为的事务属性,这些属性包括事务隔离级别,事务传播行为,超时时间,回滚规则
Spring通过aop/tx Schema命名空间和@Transaction注解技术来进行声明式事务配置。
Mybatis
每一个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心。首先用字节流通过Resource将配置文件读入,然后通过SqlSessionFactoryBuilder().build方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值