频繁地调用AttachCurrentThread和DetachCurrentThread,在并发的情况下会有比较严重的Memory Leak,在一个CPU的机器上几率很小,但是多个或者多核的机器上很容易跑出来。
问题出在ParkEvent链表上(其实有问题的还有Park链表),对它的读写并没有全局加锁。具体可以参考源码:thread.cpp。
解决方法也很简单,调用者自己加把锁就行了。
频繁地调用AttachCurrentThread和DetachCurrentThread,在并发的情况下会有比较严重的Memory Leak,在一个CPU的机器上几率很小,但是多个或者多核的机器上很容易跑出来。
问题出在ParkEvent链表上(其实有问题的还有Park链表),对它的读写并没有全局加锁。具体可以参考源码:thread.cpp。
解决方法也很简单,调用者自己加把锁就行了。
关键问题没有交代: 如何能定位到是PartEvent链表的问题? 是不是attachThread上发现很多不应该出现的错误?
It is the list. There is racing problem when accessing this list.
用libumem可以看到很多AttachCurrentThread带来的内存分配,从JVM的设计上来看,这些分配是不应该发生的,所以就是这些内存在被回收到一个链表的时候发生的并发问题。
其实thread.cpp里面的注释已经提到了这个并发的问题,只是写这段代码的人认为问题不严重,出现的几率不大,就把它放过去了。