diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c
new file mode 100644
index 93ec653..14d14cf
*** a/src/backend/access/transam/slru.c
--- b/src/backend/access/transam/slru.c
*************** SimpleLruInit(SlruCtl ctl, const char *n
*** 205,219 ****
  		shared->page_lru_count = (int *) (ptr + offset);
  		offset += MAXALIGN(nslots * sizeof(int));
  
  		if (nlsns > 0)
  		{
  			shared->group_lsn = (XLogRecPtr *) (ptr + offset);
  			offset += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr));
  		}
  
- 		/* Initialize LWLocks */
- 		shared->buffer_locks = (LWLockPadded *) ShmemAlloc(sizeof(LWLockPadded) * nslots);
- 
  		Assert(strlen(name) + 1 < SLRU_MAX_NAME_LENGTH);
  		strlcpy(shared->lwlock_tranche_name, name, SLRU_MAX_NAME_LENGTH);
  		shared->lwlock_tranche_id = tranche_id;
--- 205,223 ----
  		shared->page_lru_count = (int *) (ptr + offset);
  		offset += MAXALIGN(nslots * sizeof(int));
  
+ 		/* Initialize LWLocks */
+ 		shared->buffer_locks = (LWLockPadded *) (ptr + offset);
+ 		offset += MAXALIGN(nslots * sizeof(LWLockPadded));
+ 
+ 		/* Should fit to estimated shmem size */
+ 		Assert(offset <= SimpleLruShmemSize(nslots, nlsns));
+ 
  		if (nlsns > 0)
  		{
  			shared->group_lsn = (XLogRecPtr *) (ptr + offset);
  			offset += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr));
  		}
  
  		Assert(strlen(name) + 1 < SLRU_MAX_NAME_LENGTH);
  		strlcpy(shared->lwlock_tranche_name, name, SLRU_MAX_NAME_LENGTH);
  		shared->lwlock_tranche_id = tranche_id;
