本文主要是介绍意外的内存分配:JIT编译抖动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我在 ByteWatcher (见我最后一篇文章)工作时,碰到了一些奇怪的事情。
这是一段用来查找在特殊线程上分配了多少内存的真实代码片段。
return (long) mBeanServer.invoke(
name,
GET_THREAD_ALLOCATED_BYTES,
PARAMS,
SIGNATURE
);
全部上下文参见这里。
https://github.com/danielshaya/ByteWatcher/blob/master/src/main/java/ByteWatcherSingleThread.java
(ByteWatcher的工作方式是周期性地调用这个方法来监视内存分配。)
要注意的一个重点是,特别是当程序希望获得精确大小的内存分配时来调用上面的代码——会引起内存分配。
该调用引起的内存分配必须从返回数字中扣除,因此我们隔离了程序引起的内存分配,例如调用meanBeanServer = 程序线程的内存分配 + 调用开销 。
我注意到,这个内存分配总是336字节。然而,当我在一个循环中调用这个方法时,发现了一些有趣的东西。几乎每隔一段时间,就会分配不同数量的内存。
测试如下:
<a href="http://www.jobbole.com/members/madao">@Test</a>
public void testQuietMeasuringThreadAllocatedBytes() {
ByteWatcherSingleThread am = new ByteWatcherSingleThread();
System
这篇关于意外的内存分配:JIT编译抖动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!