其他

129 阅读3分钟

blog.csdn.net/pointer_v/a…

  1. 实话是说,我的项目是单体应用,没有遇到过并发编程相关东西。但是我在博客上看过大量的并发编程的面试题,感觉自己基础知识掌握的还不错,我说一下自己掌握的并发编程基础知识吧。 并发编程我自己总结的思路是,引发点是多线程。对于多线程:多线程这边涉及线程的状态以及线程的生命周期,包括创建-待续-运行-阻塞-销毁,线程通信,线程池(这个是重点,包括参数以及整个流程);再往下就是线程安全,保证线程安全的有乐观锁(CAS wait\notify),悲观锁有(1)synchronized(代码,代码块,变量,锁升级,)CAS,volatile,JMM模型,缓存一致性 (2)RentrantLock -AQS 当然,悲观锁还有并发包里的Concurrthashmap/vector等

  2. 实话实说,我自己是做类似平台中间件的,我不清楚我线上的JVM的配置,但是我看过网上的相关问题,还是说我自己总结的思路。 线上的问题一般是CPU100%或者OOM问题,对于OOM问题:会在JVM上配置启动参数(HeapDumpOurOfMemoryError),也就是当发生OOM的时候dump出内存快照,Java自带的分析工具(jvisualVM一般不用,不好用),会使用图形化的工具MemoryAnalyzeTools工具,分析dump出来的内存快照,查看哪个对象排序占内存一直不释放——goto GCROOT ———— Thread stack定位代码位置。然后解决问题。 对于CPU100%问题,解决思路是首先定位进程,然后定位线程,然后定位代码 (1)top-c 显示进程列表,并按照CPU使用率排序,找到负载最高的进程id (2)top -Hp 进程id 查看该进程的哪个线程CPU最高,找到线程id (3)jstack 线程id(转换成二进制的) 查看哪个类的哪个方法导致的CPU100%问题, (4)再去排查代码

(1)跑一便sql,看看时间是否符合预期,逐一排除缓存的情况 (2)使用explain查看执行计划,看type类型(是否走了索引),看rows是否超过了预期,看extra是否回表,如果行数不对,还可用analyze进一步查看实际执行情况。 如果没有建索引就添加索引,如果有索引但不是最优的,就优化索引,若索引走错了就force index强制走索引。 4. 对于系统问题,2年前,我们之前使用的是SqlServer数据库,后来软件迁移MySQL,需要MySQL驱动,由于软件是部署在XP系统上的,mysql驱动版本很低,我就在网上下载了一个5.1版本的,自己测试也没问题,但是到了线上,在插入数据的时候,有的可以插入数据库,有的不可以插入,就怀疑是不是XP系统太老了,就排查XP系统odbc配置,发现配置没有问题,自己的代码也没有问题,那差不多就是驱动的问题,去网上搜索 odbc XP 系统,发现一篇博客,说是不兼容,需要使用3.51,再去调试,发现可以使用。没有问题。