Skip to content

Commit

Permalink
Minor tweaks to memory allocation trackers
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrei Koval committed Mar 6, 2018
1 parent c109b71 commit 74cb2da
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 37 deletions.
Expand Up @@ -27,31 +27,31 @@
* @see org.neo4j.memory.MemoryAllocationTracker * @see org.neo4j.memory.MemoryAllocationTracker
* @see MemoryTracker * @see MemoryTracker
*/ */
public class GlobalMemoryTracker implements MemoryTracker, MemoryAllocationTracker public class GlobalMemoryTracker implements MemoryAllocationTracker
{ {
private LongAdder longAdder = new LongAdder();

public static final GlobalMemoryTracker INSTANCE = new GlobalMemoryTracker(); public static final GlobalMemoryTracker INSTANCE = new GlobalMemoryTracker();


private final LongAdder allocatedBytes = new LongAdder();

private GlobalMemoryTracker() private GlobalMemoryTracker()
{ {
} }


@Override @Override
public long usedDirectMemory() public long usedDirectMemory()
{ {
return longAdder.sum(); return allocatedBytes.sum();
} }


@Override @Override
public void allocate( long allocatedBytes ) public void allocated( long bytes )
{ {
longAdder.add( allocatedBytes ); allocatedBytes.add( bytes );
} }


@Override @Override
public void deallocate( long deAllocatedBytes ) public void deallocated( long bytes )
{ {
longAdder.add( -deAllocatedBytes ); allocatedBytes.add( -bytes );
} }
} }
Expand Up @@ -24,23 +24,22 @@
* tracking of memory that is independent from global. * tracking of memory that is independent from global.
* All allocations/de-allocation reported to this trackers also will be reported to global tracker transparently. * All allocations/de-allocation reported to this trackers also will be reported to global tracker transparently.
*/ */
public class LocalMemoryTracker implements MemoryTracker, MemoryAllocationTracker public class LocalMemoryTracker implements MemoryAllocationTracker
{ {
private long allocatedBytes; private long allocatedBytes;
private GlobalMemoryTracker globalTracker = GlobalMemoryTracker.INSTANCE;


@Override @Override
public void allocate( long allocatedBytes ) public void allocated( long bytes )
{ {
globalTracker.allocate( allocatedBytes ); GlobalMemoryTracker.INSTANCE.allocated( bytes );
this.allocatedBytes += allocatedBytes; this.allocatedBytes += bytes;
} }


@Override @Override
public void deallocate( long deallocatedBytes ) public void deallocated( long bytes )
{ {
globalTracker.deallocate( deallocatedBytes ); GlobalMemoryTracker.INSTANCE.deallocated( bytes );
this.allocatedBytes -= deallocatedBytes; this.allocatedBytes -= bytes;
} }


/** /**
Expand Down
Expand Up @@ -22,17 +22,17 @@
/** /**
* Memory allocation tracker that tracks bytes allocation and de-allocation * Memory allocation tracker that tracks bytes allocation and de-allocation
*/ */
public interface MemoryAllocationTracker public interface MemoryAllocationTracker extends MemoryTracker
{ {
/** /**
* Record allocation of bytes * Record allocation of bytes
* @param allocatedBytes number of allocated bytes * @param bytes number of allocated bytes
*/ */
void allocate( long allocatedBytes ); void allocated( long bytes );


/** /**
* Record de-allocation of bytes * Record de-allocation of bytes
* @param deAllocatedBytes number of de0allocated bytes * @param bytes number of de0allocated bytes
*/ */
void deallocate( long deAllocatedBytes ); void deallocated( long bytes );
} }
Expand Up @@ -30,23 +30,23 @@ public class GlobalMemoryTrackerTest
public void trackMemoryAllocations() public void trackMemoryAllocations()
{ {
long initialUsedMemory = GlobalMemoryTracker.INSTANCE.usedDirectMemory(); long initialUsedMemory = GlobalMemoryTracker.INSTANCE.usedDirectMemory();
GlobalMemoryTracker.INSTANCE.allocate( 10 ); GlobalMemoryTracker.INSTANCE.allocated( 10 );
GlobalMemoryTracker.INSTANCE.allocate( 20 ); GlobalMemoryTracker.INSTANCE.allocated( 20 );
GlobalMemoryTracker.INSTANCE.allocate( 40 ); GlobalMemoryTracker.INSTANCE.allocated( 40 );
assertEquals( 70, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory ); assertEquals( 70, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory );
} }


@Test @Test
public void trackMemoryDeallocations() public void trackMemoryDeallocations()
{ {
long initialUsedMemory = GlobalMemoryTracker.INSTANCE.usedDirectMemory(); long initialUsedMemory = GlobalMemoryTracker.INSTANCE.usedDirectMemory();
GlobalMemoryTracker.INSTANCE.allocate( 100 ); GlobalMemoryTracker.INSTANCE.allocated( 100 );
assertEquals( 100, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory ); assertEquals( 100, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory );


GlobalMemoryTracker.INSTANCE.deallocate( 20 ); GlobalMemoryTracker.INSTANCE.deallocated( 20 );
assertEquals( 80, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory ); assertEquals( 80, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory );


GlobalMemoryTracker.INSTANCE.deallocate( 40 ); GlobalMemoryTracker.INSTANCE.deallocated( 40 );
assertEquals( 40, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory ); assertEquals( 40, GlobalMemoryTracker.INSTANCE.usedDirectMemory() - initialUsedMemory );
} }
} }
Expand Up @@ -29,23 +29,23 @@ public class LocalMemoryTrackerTest
public void trackMemoryAllocations() public void trackMemoryAllocations()
{ {
LocalMemoryTracker memoryTracker = new LocalMemoryTracker(); LocalMemoryTracker memoryTracker = new LocalMemoryTracker();
memoryTracker.allocate( 10 ); memoryTracker.allocated( 10 );
memoryTracker.allocate( 20 ); memoryTracker.allocated( 20 );
memoryTracker.allocate( 40 ); memoryTracker.allocated( 40 );
assertEquals( 70, memoryTracker.usedDirectMemory()); assertEquals( 70, memoryTracker.usedDirectMemory());
} }


@Test @Test
public void trackMemoryDeallocations() public void trackMemoryDeallocations()
{ {
LocalMemoryTracker memoryTracker = new LocalMemoryTracker(); LocalMemoryTracker memoryTracker = new LocalMemoryTracker();
memoryTracker.allocate( 100 ); memoryTracker.allocated( 100 );
assertEquals( 100, memoryTracker.usedDirectMemory() ); assertEquals( 100, memoryTracker.usedDirectMemory() );


memoryTracker.deallocate( 20 ); memoryTracker.deallocated( 20 );
assertEquals( 80, memoryTracker.usedDirectMemory() ); assertEquals( 80, memoryTracker.usedDirectMemory() );


memoryTracker.deallocate( 40 ); memoryTracker.deallocated( 40 );
assertEquals( 40, memoryTracker.usedDirectMemory() ); assertEquals( 40, memoryTracker.usedDirectMemory() );
} }


Expand All @@ -56,11 +56,11 @@ public void localMemoryTrackerPropagatesAllocationsToGlobalTracker()
long initialGlobalUsage = globalMemoryTracker.usedDirectMemory(); long initialGlobalUsage = globalMemoryTracker.usedDirectMemory();
LocalMemoryTracker memoryTracker = new LocalMemoryTracker(); LocalMemoryTracker memoryTracker = new LocalMemoryTracker();


memoryTracker.allocate( 100 ); memoryTracker.allocated( 100 );
assertEquals( 100, memoryTracker.usedDirectMemory() ); assertEquals( 100, memoryTracker.usedDirectMemory() );
assertEquals( 100, globalMemoryTracker.usedDirectMemory() - initialGlobalUsage ); assertEquals( 100, globalMemoryTracker.usedDirectMemory() - initialGlobalUsage );


memoryTracker.deallocate( 50 ); memoryTracker.deallocated( 50 );
assertEquals( 50, memoryTracker.usedDirectMemory() ); assertEquals( 50, memoryTracker.usedDirectMemory() );
assertEquals( 50, globalMemoryTracker.usedDirectMemory() - initialGlobalUsage ); assertEquals( 50, globalMemoryTracker.usedDirectMemory() - initialGlobalUsage );
} }
Expand Down
Expand Up @@ -393,7 +393,7 @@ public static long allocateMemory( long sizeInBytes, MemoryAllocationTracker all
setMemory( pointer, sizeInBytes, (byte) 0xA5 ); setMemory( pointer, sizeInBytes, (byte) 0xA5 );
} }
addAllocatedPointer( pointer, sizeInBytes ); addAllocatedPointer( pointer, sizeInBytes );
allocationTracker.allocate( sizeInBytes ); allocationTracker.allocated( sizeInBytes );
return pointer; return pointer;
} }


Expand Down Expand Up @@ -431,7 +431,7 @@ public static void free( long pointer, long bytes, MemoryAllocationTracker alloc
{ {
checkFree( pointer ); checkFree( pointer );
unsafe.freeMemory( pointer ); unsafe.freeMemory( pointer );
allocationTracker.deallocate( bytes ); allocationTracker.deallocated( bytes );
} }


private static final class FreeTrace extends Throwable implements Comparable<FreeTrace> private static final class FreeTrace extends Throwable implements Comparable<FreeTrace>
Expand Down

0 comments on commit 74cb2da

Please sign in to comment.