写单元测试使用 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
所以各位大佬有用过这东西的吗,,除了改内存参数还有别的办法吗,, 是不是我使用的姿势不对?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.