
写单元测试使用 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 日 你写的测试用例很多吗??? jdk8 以下可以通过调整 PermSize 和 MaxPermSize |
2 YellowLittleDog 2017 年 11 月 30 日 via Android Android 的单元测试应该,没发现什么问题。 |
3 AccIdent 2017 年 11 月 30 日 看一下哪些对象在引用这些,目测可能是成员变量没有在 tearDown 里面解除引用 |
4 ewBuyVmLZMZE 2017 年 11 月 30 日 在我看来,一切需要用 PowerMock 才能写的测试,说明现有代码抽象有问题。 |
6 lawrencexu 2017 年 12 月 1 日 试试 JMockit ? |
7 seancheer 2017 年 12 月 1 日 1.8 之后,metaspace 只有 class 的 metadata,难道你的类很多?导致加载到 jvm 中的 metaspace 空间不够了? |