diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c
index 4bbd0ec64950f3090ba10f8a790c952f7051412a..20f31ed218d7e6f9617da3b4cc3d8d465d8c3e5d 100644
--- a/src/backend/port/sysv_shmem.c
+++ b/src/backend/port/sysv_shmem.c
@@ -419,10 +419,17 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port)
 		 */
 		AnonymousShmem = mmap(NULL, size, PROT_READ|PROT_WRITE, PG_MMAP_FLAGS,
 							  -1, 0);
-		if (AnonymousShmem == NULL)
+		if (AnonymousShmem == MAP_FAILED)
 			ereport(FATAL,
-			 (errmsg("could not map %lu bytes of anonymous shared memory: %m",
-				(unsigned long) AnonymousShmemSize)));
+			 (errmsg("could not map anonymous shared memory: %m"),
+			  (errno == ENOMEM) ?
+			   errhint("This error usually means that PostgreSQL's request "
+					   "for a shared memory segment exceeded available memory "
+					   "or swap space. To reduce the request size (currently "
+					   "%lu bytes), reduce PostgreSQL's shared memory usage, "
+					   "perhaps by reducing shared_buffers or "
+					   "max_connections.",
+					(unsigned long) AnonymousShmemSize) : 0));
 
 		/* Now we can allocate a minimal SHM block. */
 		allocsize = sizeof(PGShmemHeader);