写单元测试使用 PowerMock + Mockito 进行 Mock, Jvm 内存分配 512 M, 写到一定数量之后突然报 OOM, 经过分析是永久区 PermGen 爆炸。切换 jdk 1.8 之后可以运行, 又补充了一堆用例之后, 元空间 MetaSpace 爆炸。
经过 jmap -heap [pid] 打印:
Eden Space:
capacity = 163053568 (155.5MB)
used = 158304616 (150.9710464477539MB)
free = 4748952 (4.528953552246094MB)
97.08748967701216% used
PS Old Generation
capacity = 358088704 (341.5MB)
used = 358061344 (341.4739074707031MB)
free = 27360 (0.026092529296875MB)
99.99235943505217% used
然后 jmap -histo:live [pid], 发现大堆的反射和 Mock 对象存活:
sun.reflect.GeneratedSerializationConstructorAccessor999
org.powermock.api.mockito.mockmaker.PowerMockMaker
org.mockito.internal.stubbing.defaultanswers.TriesToReturnSelf
所以各位大佬有用过这东西的吗,,除了改内存参数还有别的办法吗,, 是不是我使用的姿势不对?
1
BBCCBB 2017-11-30 22:01:37 +08:00
你写的测试用例很多吗???
jdk8 以下可以通过调整 PermSize 和 MaxPermSize |
2
YellowLittleDog 2017-11-30 22:31:24 +08:00 via Android
Android 的单元测试应该,没发现什么问题。
|
3
AccIdent 2017-11-30 22:37:37 +08:00
看一下哪些对象在引用这些,目测可能是成员变量没有在 tearDown 里面解除引用
|
4
ewBuyVmLZMZE 2017-11-30 22:45:35 +08:00
在我看来,一切需要用 PowerMock 才能写的测试,说明现有代码抽象有问题。
|
6
lawrencexu 2017-12-01 09:39:23 +08:00
试试 JMockit ?
|
7
seancheer 2017-12-01 10:22:25 +08:00
1.8 之后,metaspace 只有 class 的 metadata,难道你的类很多?导致加载到 jvm 中的 metaspace 空间不够了?
|