PowerMock + Mockito 内存占用太大

2017-11-30 21:24:07 +08:00
 hqtc

写单元测试使用 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

所以各位大佬有用过这东西的吗,,除了改内存参数还有别的办法吗,, 是不是我使用的姿势不对?

2966 次点击
所在节点    Java
7 条回复
BBCCBB
2017-11-30 22:01:37 +08:00
你写的测试用例很多吗???
jdk8 以下可以通过调整 PermSize 和 MaxPermSize
YellowLittleDog
2017-11-30 22:31:24 +08:00
Android 的单元测试应该,没发现什么问题。
AccIdent
2017-11-30 22:37:37 +08:00
看一下哪些对象在引用这些,目测可能是成员变量没有在 tearDown 里面解除引用
ewBuyVmLZMZE
2017-11-30 22:45:35 +08:00
在我看来,一切需要用 PowerMock 才能写的测试,说明现有代码抽象有问题。
hqtc
2017-12-01 09:28:53 +08:00
@AccIdent 有 teardown 机制吗
lawrencexu
2017-12-01 09:39:23 +08:00
试试 JMockit ?
seancheer
2017-12-01 10:22:25 +08:00
1.8 之后,metaspace 只有 class 的 metadata,难道你的类很多?导致加载到 jvm 中的 metaspace 空间不够了?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/410939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX