1>如何定位线上服务OOM问题 java
2>JVM的GC ROOTS存在于那些地方mysql
3>mysql innodb怎样作查询优化算法
4>java cas的概念sql
Java服务OOM,比较常见的缘由是网络
⭐️ 有多是内存分配确实太小,而正常业务使用了大量内存 好比jmp -heap命令能够查看新生带,老年代内存大小的状况。看看内存自己是否分配太小。性能
⭐️ 某一个对象被频繁申请,却没有释放,内存不断泄漏,致使内存耗尽 ,好比jmap -histo:live 对象显示存活对象的信息,并按照所占内存大小的排序。由于包含了实例数、所占 内存大小、类名,因此很直观。优化
⭐️ 某一个资源被频繁申请,系统资源耗尽,例如:不断建立线程,不断发起网络链接线程
2>JVM的GC ROOTS存在于那些地方、日志
问到这个问题应该是前面一步步引导过来的,若是没有,在直接回答这个问题以前,最好简要描述一下JVM的内存结构和根搜索算法(GC ROOTS Tracing)作可达性分析。对象
⭐️ 虚拟机栈(栈桢中的本地变量表)中的引用的对象
⭐️ 方法区中的类静态属性引用的对象
⭐️ 方法区中的常量引用的对象
⭐️ 本地方法栈中JNI的引用的对象
Gc管理的主要的区域是java堆,通常状况只针对堆进行垃圾回收。方法区,栈,和本地方法区不被Gc所管理,于是选择这些区域做为GC ROOTS ,被GC ROOTS引用的不会
被垃圾回收。
mysql innodb怎样作查询优化
⭐️ innodb_buffer_pool_size 此参数的做用是缓冲数据和索引,对性能能够产生线性的提升,最大可设置为内存大小的百分之七八十的样子
⭐️ 打开慢查询日志,增长参数:log-queries-not-using-indexes,方便把系统中没有走索引的sql语句全抓出来优化
⭐️ 经过explain作查询分析,看看有没有用索引,访问的行数rows
⭐️ 关闭skip_name_resolve,减小逆向DNS解析的消耗
另外还有一些实际写代码过程当中深刻骨髓的,好比数据动静分离提升query_cache的命中率啦,减小字段冗余,减小查询次数啦,复杂查询分解啦,分页优化啦啥的。
4>java cas的概念
cas:compare and swap,比较并交换
java的concurrent包中借助cas实现了区别于synchronized同步锁的一种乐观锁。
CAS利用CPU的CAS指令,同时借用JNDI来完成java的非阻塞算法,其余的原子操做都是利用相似的特性完成的。java的concurrent包相对于使用synchronized性能提高也主要依赖它。