10月 132016
 

占用cpu高的线程的堆栈如下:

gdb 跟进发现:线程在函数Dependencies::find_finalizable_subclass(Klass*) 中,应该有一个循环,不断地调用函数Klass::subklass()

 

解决办法:

The fix was simple – disable CMS class unloading options when -Xnoclassgc or -XX:-ClassUnloading are specified.

参考资料:

https://blogs.oracle.com/poonam/entry/jvm_hang_with_cms_collector

 

想阅读jvm源码吗? https://blogs.oracle.com/sundararajan/entry/so_you_want_to_read

 Posted by at 下午 6:04
1月 082016
 

一直不觉得什么样的代码逻辑才会在小并发下没问题,而在大并发下有问题,今天终于见到了。

今天做一个压力测试,刚刚开始,程序就无法响应了;小伙伴说,重启一个服务吧,我说,还是查查为啥吧,于是发现如下问题:

环境介绍:

  1. 数据库连接池,限制最多100个链接
  2. 代码中有一个方法设置了同步(无法多个线程同时执行到该代码,锁等待)
  3. JAVA多线程环境

代码逻辑为:

  1. begin 事务
  2. 执行同步方法
    1. 同步方法中可以需要执行sql语句,需要一个空闲的数据库连接(该逻辑比较深,不太容易注意到),如果获取不到数据库连接,就等待(如果非要加一个期限的话,实际上是无限期)
  3. 执行其他sql查询
  4. 结束

当100个请求同时执行到步骤1的时候,其中一个线程抢先进入了同步方法,但是不幸的是,虽然抢先进入了同步方法,但由于数据库连接已耗尽,只好等待;但是现在其它线程拿着数据库连接却由于等待在同步方法外而无法释放数据库连接,于是,死锁出现。。。

debug过程

由于bug是在高并发下出现的,不宜单步调试,只能从出错的状态中去分析。

第一步: jstack $pid

…. (有N多线程的堆栈就出来了)

第二步: 分析堆栈

很多线程被block,推测:应该有个线程(的堆栈)和别人不太一样; 果然如此

第三步: 参照堆栈和代码,分析得到结果

 

解决办法:

。。。

 Posted by at 下午 7:35
10月 152015
 

参考资料: http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html

测试IDE: Intelijj

坎坷:

  1. 按照文档,下载了json-lib-2.4-jdk15.jar
  2. 开始写代码 (忘记了下载其他的依赖了)
  3. 编译,没有问题
  4. 执行,类找不见
  5. 由于不熟悉,浪费了一些时间
  6. 解决办法:
    1. 把异常中找不见的类放在程序的上面import一下(当然,肯定没有该类),IDE会提示类找不见,但是提示中可以“find in web”
    2. 然后就“find in web”,下载后,继续允许,继续报“类找不见”(当然,是其它的类),继续步骤1,直到不再报错

 

输出结果:

 

 Posted by at 下午 6:21
6月 142014
 

转自: http://www.importnew.com/11317.html

 

 

 Posted by at 下午 1:31