diff --git a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
index 4df6afe89a..ef12020d92 100644
--- a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
+++ b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
@@ -5,6 +5,7 @@
 use Drupal\Core\Entity\Entity\EntityViewDisplay as BaseEntityViewDisplay;
 use Drupal\Core\Entity\EntityStorageInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Entity\RevisionableInterface;
 use Drupal\Core\Plugin\Context\Context;
 use Drupal\Core\Plugin\Context\ContextDefinition;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
@@ -26,6 +27,25 @@ class LayoutBuilderEntityViewDisplay extends BaseEntityViewDisplay implements La
 
   use SectionStorageTrait;
 
+  /**
+   * The number of times this formatter allows rendering the same entity.
+   *
+   * @var int
+   */
+  const RECURSIVE_RENDER_LIMIT = 1;
+
+  /**
+   * An array of counters for the recursive rendering protection.
+   *
+   * Each counter takes into account all the relevant information about the
+   * field and the referenced entity that is being rendered.
+   *
+   * @see \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceEntityFormatter::viewElements()
+   *
+   * @var array
+   */
+  protected static $recursiveRenderDepth = [];
+
   /**
    * {@inheritdoc}
    */
@@ -136,7 +156,7 @@ protected function contextRepository() {
    */
   public function buildMultiple(array $entities) {
     $build_list = parent::buildMultiple($entities);
-
+    /** @var \Drupal\Core\Entity\FieldableEntityInterface $entity */
     foreach ($entities as $id => $entity) {
       $sections = $this->getRuntimeSections($entity);
       if ($sections) {
@@ -154,6 +174,10 @@ public function buildMultiple(array $entities) {
         //   https://www.drupal.org/node/2932462.
         $contexts['layout_builder.entity'] = new Context(new ContextDefinition("entity:{$entity->getEntityTypeId()}", new TranslatableMarkup('@entity being viewed', ['@entity' => $entity->getEntityType()->getLabel()])), $entity);
         foreach ($sections as $delta => $section) {
+          if ($this->isRecursiveRenderLimit($entity, $delta)) {
+            $build_list[$id]['_layout_builder'][$delta] = [];
+            continue;
+          }
           $build_list[$id]['_layout_builder'][$delta] = $section->toRenderArray($contexts);
         }
       }
@@ -289,4 +313,46 @@ protected function getDefaultSection() {
     return $this->getSection(0);
   }
 
+  /**
+   * Tests if this section has been rendered beyond the recursive limit.
+   *
+   * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
+   *   The entity being rendered.
+   * @param int $section_delta
+   *   The section delta.
+   *
+   * @return bool
+   *   TRUE if the recursive limit has been reached, otherwise FALSE.
+   */
+  protected function isRecursiveRenderLimit(FieldableEntityInterface $entity, $section_delta) {
+    $render_id_values = [
+      '%entity_type' => $entity->getEntityTypeId(),
+      '%entiy_id' => $entity->id(),
+      '%view_mode' => $this->getMode(),
+      '%section_delta' => $section_delta,
+    ];
+    if ($entity instanceof RevisionableInterface) {
+      $render_id_values['%revision_id'] = $entity->getRevisionId();
+    }
+    $recursive_render_id = implode(':', $render_id_values);
+
+    if (isset(static::$recursiveRenderDepth[$recursive_render_id])) {
+      static::$recursiveRenderDepth[$recursive_render_id]++;
+    }
+    else {
+      static::$recursiveRenderDepth[$recursive_render_id] = 1;
+    }
+
+    // Protect ourselves from recursive rendering.
+    if (static::$recursiveRenderDepth[$recursive_render_id] > static::RECURSIVE_RENDER_LIMIT) {
+      $error = 'Recursive rendering detected when rendering layout:';
+      foreach ($render_id_values as $key => $render_id_value) {
+        $error .= str_replace('%', '', $key) . ": $key, ";
+      }
+      $this->getLogger()->error("$error. Aborting rendering.", $render_id_values);
+      return TRUE;
+    }
+    return FALSE;
+  }
+
 }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_form_display.node.type_with_recursion.default.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_form_display.node.type_with_recursion.default.yml
new file mode 100644
index 0000000000..f702bdcb90
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_form_display.node.type_with_recursion.default.yml
@@ -0,0 +1,67 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.type_with_recursion.body
+    - node.type.type_with_recursion
+  module:
+    - text
+id: node.type_with_recursion.default
+targetEntityType: node
+bundle: type_with_recursion
+mode: default
+content:
+  body:
+    type: text_textarea_with_summary
+    weight: 121
+    settings:
+      rows: 9
+      summary_rows: 3
+      placeholder: ''
+    third_party_settings: {  }
+    region: content
+  created:
+    type: datetime_timestamp
+    weight: 10
+    region: content
+    settings: {  }
+    third_party_settings: {  }
+  promote:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 15
+    region: content
+    third_party_settings: {  }
+  status:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 120
+    region: content
+    third_party_settings: {  }
+  sticky:
+    type: boolean_checkbox
+    settings:
+      display_label: true
+    weight: 16
+    region: content
+    third_party_settings: {  }
+  title:
+    type: string_textfield
+    weight: -5
+    region: content
+    settings:
+      size: 60
+      placeholder: ''
+    third_party_settings: {  }
+  uid:
+    type: entity_reference_autocomplete
+    weight: 5
+    settings:
+      match_operator: CONTAINS
+      size: 60
+      placeholder: ''
+    region: content
+    third_party_settings: {  }
+hidden: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.default.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.default.yml
new file mode 100644
index 0000000000..c5a47ce29c
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.default.yml
@@ -0,0 +1,66 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.field.node.type_with_recursion.body
+    - node.type.type_with_recursion
+    - views.view.list_all_nodes
+  module:
+    - layout_builder
+    - layout_discovery
+    - text
+    - user
+    - views
+third_party_settings:
+  layout_builder:
+    sections:
+      -
+        layout_id: layout_onecol
+        layout_settings: {  }
+        components:
+          17412d69-83ed-4958-9385-0f4bf4ce03c7:
+            uuid: 17412d69-83ed-4958-9385-0f4bf4ce03c7
+            region: content
+            configuration:
+              id: 'field_block:node:type_with_recursion:body'
+              label_display: ''
+              formatter:
+                label: hidden
+                type: text_default
+                settings: {  }
+                third_party_settings: {  }
+              context_mapping:
+                entity: layout_builder.entity
+            additional: {  }
+            weight: 0
+          7c7b9a4c-4bbe-411b-9dc2-e924668b2713:
+            uuid: 7c7b9a4c-4bbe-411b-9dc2-e924668b2713
+            region: content
+            configuration:
+              id: 'views_block:list_all_nodes-block_1'
+              label: ''
+              provider: views
+              label_display: visible
+              views_label: ''
+              items_per_page: none
+              context_mapping: {  }
+            additional: {  }
+            weight: 1
+id: node.type_with_recursion.default
+targetEntityType: node
+bundle: type_with_recursion
+mode: default
+content:
+  body:
+    label: hidden
+    type: text_default
+    weight: 101
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+  links:
+    weight: 100
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+hidden: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.teaser.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.teaser.yml
new file mode 100644
index 0000000000..7f2fcada1f
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/core.entity_view_display.node.type_with_recursion.teaser.yml
@@ -0,0 +1,54 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.teaser
+    - field.field.node.type_with_recursion.body
+    - node.type.type_with_recursion
+  module:
+    - layout_builder
+    - layout_discovery
+    - text
+    - user
+third_party_settings:
+  layout_builder:
+    sections:
+      -
+        layout_id: layout_onecol
+        layout_settings: {  }
+        components:
+          2ec78b8d-0568-48e5-b67c-38370363877b:
+            uuid: 2ec78b8d-0568-48e5-b67c-38370363877b
+            region: content
+            configuration:
+              id: 'field_block:node:type_with_recursion:body'
+              label_display: ''
+              formatter:
+                label: hidden
+                type: text_summary_or_trimmed
+                settings:
+                  trim_length: 600
+                third_party_settings: {  }
+              context_mapping:
+                entity: layout_builder.entity
+            additional: {  }
+            weight: 0
+id: node.type_with_recursion.teaser
+targetEntityType: node
+bundle: type_with_recursion
+mode: teaser
+content:
+  body:
+    label: hidden
+    type: text_summary_or_trimmed
+    weight: 101
+    settings:
+      trim_length: 600
+    third_party_settings: {  }
+    region: content
+  links:
+    weight: 100
+    settings: {  }
+    third_party_settings: {  }
+    region: content
+hidden: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/field.field.node.type_with_recursion.body.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/field.field.node.type_with_recursion.body.yml
new file mode 100644
index 0000000000..4fa0b933dc
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/field.field.node.type_with_recursion.body.yml
@@ -0,0 +1,21 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - field.storage.node.body
+    - node.type.type_with_recursion
+  module:
+    - text
+id: node.type_with_recursion.body
+field_name: body
+entity_type: node
+bundle: type_with_recursion
+label: Body
+description: ''
+required: false
+translatable: true
+default_value: {  }
+default_value_callback: ''
+settings:
+  display_summary: true
+field_type: text_with_summary
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/node.type.type_with_recursion.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/node.type.type_with_recursion.yml
new file mode 100644
index 0000000000..d351be868d
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/node.type.type_with_recursion.yml
@@ -0,0 +1,9 @@
+langcode: en
+status: true
+name: 'Type with recursion'
+type: type_with_recursion
+description: ''
+help: ''
+new_revision: true
+preview_mode: 1
+display_submitted: true
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/views.view.list_all_nodes.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/views.view.list_all_nodes.yml
new file mode 100644
index 0000000000..c6b70d02b3
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/config/install/views.view.list_all_nodes.yml
@@ -0,0 +1,165 @@
+langcode: en
+status: true
+dependencies:
+  config:
+    - core.entity_view_mode.node.full
+  module:
+    - node
+    - user
+id: list_all_nodes
+label: 'List all nodes'
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'access content'
+      cache:
+        type: tag
+        options: {  }
+      query:
+        type: views_query
+        options:
+          disable_sql_rewrite: false
+          distinct: false
+          replica: false
+          query_comment: ''
+          query_tags: {  }
+      exposed_form:
+        type: basic
+        options:
+          submit_button: Apply
+          reset_button: false
+          reset_button_label: Reset
+          exposed_sorts_label: 'Sort by'
+          expose_sort_order: true
+          sort_asc_label: Asc
+          sort_desc_label: Desc
+      pager:
+        type: none
+        options:
+          items_per_page: 0
+          offset: 0
+      style:
+        type: default
+      row:
+        type: 'entity:node'
+        options:
+          view_mode: full
+      fields:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          label: ''
+          alter:
+            alter_text: false
+            make_link: false
+            absolute: false
+            trim: false
+            word_boundary: false
+            ellipsis: false
+            strip_tags: false
+            html: false
+          hide_empty: false
+          empty_zero: false
+          settings:
+            link_to_entity: true
+          plugin_id: field
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exclude: false
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: true
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: true
+          empty: ''
+          hide_alter_empty: true
+          click_sort_column: value
+          type: string
+          group_column: value
+          group_columns: {  }
+          group_rows: true
+          delta_limit: 0
+          delta_offset: 0
+          delta_reversed: false
+          delta_first_last: false
+          multi_type: separator
+          separator: ', '
+          field_api_classes: false
+      filters:
+        status:
+          value: '1'
+          table: node_field_data
+          field: status
+          plugin_id: boolean
+          entity_type: node
+          entity_field: status
+          id: status
+          expose:
+            operator: ''
+          group: 1
+      sorts:
+        created:
+          id: created
+          table: node_field_data
+          field: created
+          order: DESC
+          entity_type: node
+          entity_field: created
+          plugin_id: date
+          relationship: none
+          group_type: group
+          admin_label: ''
+          exposed: false
+          expose:
+            label: ''
+          granularity: second
+      title: 'List all nodes'
+      header: {  }
+      footer: {  }
+      empty: {  }
+      relationships: {  }
+      arguments: {  }
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
+  block_1:
+    display_plugin: block
+    id: block_1
+    display_title: Block
+    position: 1
+    display_options:
+      display_extenders: {  }
+    cache_metadata:
+      max-age: -1
+      contexts:
+        - 'languages:language_content'
+        - 'languages:language_interface'
+        - 'user.node_grants:view'
+        - user.permissions
+      tags: {  }
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/layout_builder_recursive_test.info.yml b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/layout_builder_recursive_test.info.yml
new file mode 100644
index 0000000000..7025992b06
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_recursive_test/layout_builder_recursive_test.info.yml
@@ -0,0 +1,8 @@
+name: 'Layout Builder Recursive Test'
+type: module
+description: 'Support module for testing recursion prevention.'
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+  - views
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml b/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml
new file mode 100644
index 0000000000..ddf9956dbe
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_test/config/schema/layout_builder_test.schema.yml
@@ -0,0 +1,10 @@
+block.settings.layout_builder_test_entity_block:
+  type: block_settings
+  label: 'Test Entity Block'
+  mapping:
+    entity_type_id:
+      type: string
+      label: 'Entity type ID'
+    entity_id:
+      type: integer
+      label: 'Entity ID'
diff --git a/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/EntityBlock.php b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/EntityBlock.php
new file mode 100644
index 0000000000..711684b44e
--- /dev/null
+++ b/core/modules/layout_builder/tests/modules/layout_builder_test/src/Plugin/Block/EntityBlock.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\layout_builder_test\Plugin\Block;
+
+use Drupal\Core\Block\BlockBase;
+
+/**
+ * Provides a block that renders an arbitrary entity.
+ *
+ * @Block(
+ *   id = "layout_builder_test_entity_block",
+ *   admin_label = @Translation("Test Entity Block"),
+ * )
+ */
+class EntityBlock extends BlockBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return [
+      'entity_type_id' => NULL,
+      'entity_id' => NULL,
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    $entity = \Drupal::entityTypeManager()
+      ->getStorage($this->configuration['entity_type_id'])
+      ->load($this->configuration['entity_id']);
+    return \Drupal::entityTypeManager()
+      ->getViewBuilder($this->configuration['entity_type_id'])
+      ->view($entity);
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php b/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php
new file mode 100644
index 0000000000..159d507a25
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Functional/LayoutRecursionTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Functional;
+
+use Drupal\node\Entity\Node;
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests recursion prevention in layouts.
+ *
+ * @group layout_builder
+ */
+class LayoutRecursionTest extends BrowserTestBase {
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'views',
+    'layout_builder',
+    'block',
+    'node',
+    'layout_builder_recursive_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    // @todo The Layout Builder UI relies on local tasks; fix in
+    //   https://www.drupal.org/project/drupal/issues/2917777.
+    $this->drupalPlaceBlock('local_tasks_block');
+
+
+    // @todo Find balance.
+    // when creating 5 nodes here
+    // \Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay::RECURSIVE_RENDER_LIMIT
+    // has to be 1.
+    for ($i = 1; $i <= 5; $i++) {
+      Node::create([
+        'type' => 'type_with_recursion',
+        'title' => "Title $i",
+        'body' => "Body text $i",
+      ])->save();
+    }
+  }
+
+  /**
+   * Tests recursion prevention.
+   *
+   * @throws \Behat\Mink\Exception\ResponseTextException
+   */
+  public function testRecursionPrevention() {
+    $this->drupalLogin($this->drupalCreateUser([
+      'access content',
+    ]));
+
+    $this->drupalGet('node/1');
+    $this->assertSession()->pageTextContains("Title 1");
+
+  }
+}
diff --git a/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php b/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php
new file mode 100644
index 0000000000..c5cc07bcd3
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Kernel/SectionComponentRecursionTest.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Kernel;
+
+use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
+use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
+use Drupal\layout_builder\Section;
+use Drupal\layout_builder\SectionComponent;
+
+/**
+ * Tests the recursion protection in \Drupal\layout_builder\SectionComponent.\
+ *
+ * @group layout_builder
+ */
+class SectionComponentRecursionTest extends EntityKernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = [
+    'entity_test',
+    'layout_builder',
+    'layout_builder_test',
+    'layout_discovery',
+    'layout_test',
+  ];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->installEntitySchema('entity_test');
+  }
+
+  /**
+   * Tests that Layout Builder protects against recursive rendering.
+   */
+  public function testRecursion() {
+    $entity_storage = $this->container->get('entity_type.manager')->getStorage('entity_test');
+    // @todo Remove langcode workarounds after resolving
+    //   https://www.drupal.org/node/2915034.
+    $entity = $entity_storage->createWithSampleValues('entity_test', [
+      'langcode' => 'en',
+      'langcode_default' => TRUE,
+    ]);
+    $entity->save();
+
+    $section = new Section('layout_onecol');
+    $component = (new SectionComponent(\Drupal::service('uuid')->generate(), 'content', [
+      'id' => 'layout_builder_test_entity_block',
+      'entity_type_id' => $entity->getEntityTypeId(),
+      'entity_id' => $entity->id(),
+    ]));
+    $section->appendComponent($component);
+    $display = LayoutBuilderEntityViewDisplay::create([
+      'targetEntityType' => 'entity_test',
+      'bundle' => 'entity_test',
+      'mode' => 'default',
+      'status' => TRUE,
+      'third_party_settings' => [
+        'layout_builder' => [
+          'sections' => [$section],
+        ],
+      ],
+    ]);
+    $display->save();
+
+    $build = $this->container->get('entity_type.manager')
+      ->getViewBuilder('entity_test')
+      ->view($entity);
+
+    // This would recursively render $entity without our protection, and throw
+    // an exception.
+    $this->assertFalse(empty($this->render($build)));
+  }
+
+}
