1.java 探针
jdk1.5以后引入了javaAgent技术,javaAgent是运行方法之前的拦截器。我们利用javaAgent和ASM字节码技术,在JVM加载class二进制文件的时候,将方法耗时及内部调用情况放入处理器,处理器利用栈先进后出的特点对方法调用先后顺序做处理,当一个请求处理结束后,将耗时方法轨迹和入参map输出到文件中,然后根据map中相应参数或耗时方法轨迹中的关键代码区分出我们要抓取的耗时业务。最后将相应耗时轨迹文件取下来,转化为xml格式并进行解析
2.线程池自己实现
(1)线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。
(2)可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。
corePoolSize:线程池核心线程数量
maximumPoolSize:线程池最大线程数量
keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
unit:存活时间的单位
workQueue:存放任务的队列
handler:超出线程范围和队列容量的任务的处理程序
运行原理:
刚开始都是在创建新的线程,达到核心线程数量5个后,新的任务进来后不再创建新的线程,而是将任务加入工作队列,任务队列到达上线5个后,新的任务又会创建新的普通线程,直到达到线程池最大的线程数量10个,后面的任务则根据配置的饱和策略来处理。我们这里没有具体配置,使用的是默认的配置AbortPolicy:直接抛出异常。
3.容器的原理与底层
容器:Collection收集,集合。本身也是一个对象,只不过它可以容纳其他的对象。
4.RESTFUL 说明
按照HTTP协议的规定:
GET方法是安全且幂等的
POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),
PUT、DELETE方法都是不安全但幂等的。
4.说说项目中遇到的印象最深的一个问题? 我想一下啊,我说一下一次性能调优的问题;我们系统在有一个阶段,每天高峰期的时候都会比较卡,都通过重启解决;我解决这个问题后系统很久都不需要重启了; 首先分析是否是内存阻塞或者full GC导致应用卡死,于是我打开了full GC日志,并使用jstack dump线程下来,我就发现没有进行full GC,很多线程在wait;于是我 就怀疑是数据库问题,我就联系了运维,让他帮忙导出数据库的报告;导出来之后我就发现有一个sql的磁盘io占用90%多;于是我就看了下该SQL执行计划;发现当前 执行计划有索引没命中,于是我就重新做表分析,让数据库决定一个最佳执行计划,问题解决了;于是我就将遇到的这次问题分享给了相关同事。