java内存单元_测量代码单元的内存使用情况

我有一个函数 memory ,它接受一个函数并测量它的内存使用情况:

import java.lang.management.ManagementFactory

def memory[T](

f: ⇒ T

)(

mu: Long ⇒ Unit

): T = {

val memoryMXBean = ManagementFactory.getMemoryMXBean

memoryMXBean.gc()

val usedBefore = memoryMXBean.getHeapMemoryUsage.getUsed

println(s"${memoryMXBean.getObjectPendingFinalizationCount()} pending, used $usedBefore")

val r = f

memoryMXBean.gc()

val usedAfter = memoryMXBean.getHeapMemoryUsage.getUsed

println(s"${memoryMXBean.getObjectPendingFinalizationCount()} pending, used $usedAfter")

mu(usedAfter - usedBefore)

r

}

获取 new Array[Byte](1024*1024) 使用的内存量应返回1MB .

memory{new Array[Byte](1024*1024)}{r=>println(s"$r byte")}

但是第一次调用内存会返回一个否定结果,后续调用测量(即使使用不同的bodys)内存使用情况就好了:

scala> memory{new Array[Byte](1024*1024)}{r=>println(s"$r byte")}

0 pending, used 45145040

0 pending, used 45210384

65344 byte

scala> memory{new Array[Byte](1024*1024)}{r=>println(s"$r byte")}

0 pending, used 45304512

0 pending, used 46353104

1048592 byte

在两个_1783747之间的某个地方被释放,但是没有待释放的对象 . 当您有一个空体时也可以确定此行为(记得重新启动scala控制台以获得此结果):

scala> memory{}{r=>println(s"$r byte")}

0 pending, used 44917584

0 pending, used 44025552

-892032 byte

scala> memory{}{r=>println(s"$r byte")}

0 pending, used 44070440

0 pending, used 44069960

-480 byte

同时在控制台上执行 gc() 和 getHeapMemoryUsage 会产生以下结果:

scala> import java.lang.management.ManagementFactory; val memoryMXBean = ManagementFactory.getMemoryMXBean; memoryMXBean.setVerbose(true)

import java.lang.management.ManagementFactory

memoryMXBean: java.lang.management.MemoryMXBean = sun.management.MemoryImpl@2f98635e

scala> memoryMXBean.gc(); memoryMXBean.getHeapMemoryUsage

[GC (System.gc()) 57400K->44462K(109056K), 0,0148555 secs]

[Full GC (System.gc()) 44462K->39602K(109056K), 0,2641397 secs]

res1: java.lang.management.MemoryUsage = init = 33554432(32768K) used = 41358440(40389K) committed = 111673344(109056K) max = 239075328(233472K)

scala> memoryMXBean.gc(); memoryMXBean.getHeapMemoryUsage

[GC (System.gc()) 46702K->40258K(111104K), 0,0025801 secs]

[Full GC (System.gc()) 40258K->39631K(111104K), 0,1988796 secs]

res2: java.lang.management.MemoryUsage = init = 33554432(32768K) used = 40583120(39631K) committed = 113770496(111104K) max = 239075328(233472K)

41358440 - 40583120 = 775320 ,内存使用量减少近800kb(参见 used ) .

为什么第一次测量会返回错误的结果?有没有办法解决这个问题,而不是运行两次方法?

在Arch Linux上使用 Scala 2.12.1-20161205-201300-2787b47 (OpenJDK 64-Bit Server VM, Java 1.8.0_112) .

谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值