diff --git a/src/video_core/shader/shader.cpp b/src/video_core/shader/shader.cpp
index babb124fef..509558fc00 100644
--- a/src/video_core/shader/shader.cpp
+++ b/src/video_core/shader/shader.cpp
@@ -32,6 +32,12 @@ namespace Shader {
 static std::unordered_map<u64, CompiledShader*> shader_map;
 static JitCompiler jit;
 static CompiledShader* jit_shader;
+
+static void ClearCache() {
+    shader_map.clear();
+    jit.Clear();
+    LOG_INFO(HW_GPU, "Shader JIT cache cleared");
+}
 #endif // ARCHITECTURE_x86_64
 
 void Setup(UnitState<false>& state) {
@@ -45,6 +51,12 @@ void Setup(UnitState<false>& state) {
         if (iter != shader_map.end()) {
             jit_shader = iter->second;
         } else {
+            // Check if remaining JIT code space is enough for at least one more (massive) shader
+            if (jit.GetSpaceLeft() < jit_shader_size) {
+                // If not, clear the cache of all previously compiled shaders
+                ClearCache();
+            }
+
             jit_shader = jit.Compile();
             shader_map.emplace(cache_key, jit_shader);
         }
@@ -54,7 +66,7 @@ void Setup(UnitState<false>& state) {
 
 void Shutdown() {
 #ifdef ARCHITECTURE_x86_64
-    shader_map.clear();
+    ClearCache();
 #endif // ARCHITECTURE_x86_64
 }
 
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp
index 1c700fca78..e6cdfe9c5a 100644
--- a/src/video_core/shader/shader_jit_x64.cpp
+++ b/src/video_core/shader/shader_jit_x64.cpp
@@ -789,7 +789,7 @@ CompiledShader* JitCompiler::Compile() {
 }
 
 JitCompiler::JitCompiler() {
-    AllocCodeSpace(1024 * 1024 * 4);
+    AllocCodeSpace(jit_cache_size);
 }
 
 void JitCompiler::Clear() {
diff --git a/src/video_core/shader/shader_jit_x64.h b/src/video_core/shader/shader_jit_x64.h
index 5ad2d9606f..5357c964bf 100644
--- a/src/video_core/shader/shader_jit_x64.h
+++ b/src/video_core/shader/shader_jit_x64.h
@@ -19,6 +19,11 @@ namespace Pica {
 
 namespace Shader {
 
+/// Memory needed to be available to compile the next shader (otherwise, clear the cache)
+constexpr size_t jit_shader_size = 1024 * 512;
+/// Memory allocated for the JIT code space cache
+constexpr size_t jit_cache_size = 1024 * 1024 * 8;
+
 using CompiledShader = void(void* registers);
 
 /**