1、java 内存模型是什么,为什么提出这个模型
java 内存模型的目标是定义程序中各个共享变量的访问规则,也就是在虚拟机中将变量存储到内存以及从内存中取出变量这类的底层细节。通过这些规则来规范对内存的读写操作,保证了并发场景下的可见性、原子性和有序性**
主内存和线程内存怎么保证同步
2、volatile有什么特点、使用场景是什么、什么是 AQS
利用volatile的可见性以及硬件 CAS 指令实现轻量级锁, jdk8中的锁基本都是通过这种方式实现的
3、对象是如何分配、回收的
①:class 加载到元数据区(方法区),栈上分配引用,堆上分配对象,回收对象是主要看对象是否被栈或元数据区引用(GC ROOT就是栈或元数据区的引用),无则回收
②:对象未被 GCROOT 引用,对象可能不被回收,第一种是对象实现
finalize,第二种就是非强引用(软、弱、虚引用)
4、为什么需要 jvm 调优
因为 jvm 启动需要设置内存大小,大小设置不合理,高峰期易出现 频繁GC (注意老年代 GC 代价很高,GC 会挂起java 线程),而 GC 会暂停程序反应到线上就是请求速度慢,高并发场景下容易出现此问题,所以要调优
5、如何去做 jvm 调优 ,jvm 大小如何估算
①、估算高峰期下,存活对象的大小,比如为 a,则可粗略设置堆=4a,老年代=1.5a,新生代=2.5a
②、压测模拟或手动触发 fullGC后,观测老年代占用大小,比如 a,可粗略设置堆=4a,老年代=1.5a,新生代=2.5a (一般的估算原则)
就是不断找一个合适的平衡点,降低 FullGC,进而降低卡顿现象。
③、堆大小一般最大值和最小值设置一样,避免频繁的空间收缩
④、常用命令:jstack、jmap、jstat
6、什么锁的优化
①:锁消除:自动分析出优先代码加锁,但是执行时无需加锁,此时 jvm 会移除加锁处理
②:轻量级锁:相比通过操作系统加锁(切换开销),cas 机制更加轻量级,简单自选实现高效加锁
7、使用线程池有什么注意点
队列一般设置有界队列,注意大小,防止 jvm 宕机导致内存队列丢失,同时设置拒绝策略,线程池是如何收缩的(coresize、queue 、maxsize 自动收缩)
8、常用的数据结构
散列表-拉链法解决冲突,HashMap、TreeMap、LinkedHashMap
HashMap( 数组 + 链表 + 红黑树)
LinkedHashMap (散列表 + 双端链表)
ThreadLocalMap
9、连接池相关的参数是如何估算的
依据高峰期的 qps 大小进行估算池的相关参数
网友评论