Приложение Expo зависло на заставке, а затем произошел сбой Hermes OOM (3 ГБ ОЗУ) на симуляторах iOS и Android.IOS

Программируем под IOS
Ответить
Anonymous
 Приложение Expo зависло на заставке, а затем произошел сбой Hermes OOM (3 ГБ ОЗУ) на симуляторах iOS и Android.

Сообщение Anonymous »

Проблема

Когда я открываю приложение, на несколько секунд появляется заставка, а затем приложение вылетает. С течением времени он начинает потреблять все больше и больше памяти. При достижении 3 ГБ оперативной памяти вылетает и закрывается. В консоли выставки нет журнала, но я нашел соответствующий журнал в собственных журналах iOS:

Код: Выделить всё

2025-11-26 11:30:31.097 I  Expo Go[11351:3cbc4] [dev.hermesengine:Default] HermesGC: OOM: [RNBridgeless] reason = Max heap size was exceeded (1 from category: vm_allocate_category), numCollections = 3193, heapSize = 3221225472, allocated = 3145696648, va = 3221225472, external = 2997258.
вот мой package.json

Код: Выделить всё

{
"name": "my_app",
"main": "expo-router/entry",
"version": "1.0.0",
"scripts": {
"start": "expo start",
"reset-project": "node ./scripts/reset-project.js",
"android": "expo run:android",
"ios": "expo run:ios",
"web": "expo start --web",
"lint": "expo lint"
},
"dependencies": {
"@expo/vector-icons": "^15.0.3",
"@react-native-async-storage/async-storage": "2.2.0",
"@react-navigation/bottom-tabs": "^7.4.0",
"@react-navigation/elements": "^2.6.3",
"@react-navigation/native": "^7.1.8",
"expo": "~54.0.25",
"expo-constants": "~18.0.10",
"expo-font": "~14.0.9",
"expo-haptics": "~15.0.7",
"expo-image": "~3.0.10",
"expo-linear-gradient": "~15.0.7",
"expo-linking": "~8.0.9",
"expo-router": "~6.0.15",
"expo-splash-screen": "~31.0.11",
"expo-status-bar": "~3.0.8",
"expo-symbols": "~1.0.7",
"expo-system-ui": "~6.0.8",
"expo-web-browser": "~15.0.9",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.5",
"react-native-gesture-handler": "~2.28.0",
"react-native-reanimated": "~4.1.1",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-svg": "15.12.1",
"react-native-svg-transformer": "^1.5.2",
"react-native-web": "~0.21.0",
"react-native-worklets": "0.5.1"
},
"devDependencies": {
"@types/react": "~19.1.0",
"eslint": "^9.25.0",
"eslint-config-expo": "~10.0.0",
"typescript": "~5.9.2"
},
"private": true
}
Что я использую
  • Аппаратное обеспечение: Mac mini m4
  • ОС: macOS Tahoe 26.1
  • Симулятор: симулятор Xcode iPhone 16e (iOS 26.1) и эмулятор студии Android Pixel 9a
  • Версия Xcode: версия 26.1.1 (17B100)
И симулятор Android, и симулятор iOS вызывают одну и ту же проблему. Что происходит? Мое приложение не такое уж большое. Это похоже на бесконечный цикл рендеринга (правда, я не знаю), но ни один из моих компонентов не рендерится. Я предполагаю, что сбой происходит до того, как реакция монтируется. Приложение полностью зависает на заставке, а затем вылетает.
Что я пробовал:
  • Сбросить Metro (expo start --clear)
  • expo prebuild + pod install (попробовал собрать вместо Expo go, но возникла та же проблема.)
  • Удаление всех поставщиков контекста
  • Удаление пользовательских шрифты
  • Тестирование симуляторов iOS и Android
Я также попробовал новый свежий проект Expo, и он не вызвал этой проблемы. Вероятно, это вызвано моим ThemeProvide.tsx. Когда я удалил эту проблему, проблема исчезла.
ThemeProvider.tsx

Код: Выделить всё

import { ThemeContext } from "@/context/theme";
import { dark, light } from "@/design";
import { UserPref } from "@/design/colors";
import AsyncStorage from "@react-native-async-storage/async-storage";
import { useCallback, useEffect, useMemo, useState } from "react";
import { ColorSchemeName, useColorScheme } from "react-native";
import { ProviderProps } from "../provider.types";

const STORAGE_KEY = "app_theme_pref";

const resolveMode = (userPref: UserPref, sys: ColorSchemeName) => {
const scheme = sys ?? "light";
return userPref === "system" ? scheme : userPref;
};

const ThemeProvider = ({ children }: ProviderProps) => {
const [userPref, setUserPref] = useState("system");
const sys = useColorScheme();

useEffect(() => {
(async () => {
const saved = await AsyncStorage.getItem(STORAGE_KEY);
if (saved === "light" || saved === "dark" || saved === "system") {
setUserPref(saved);
}
})();
}, []);

const effectiveMode = useMemo(
() => resolveMode(userPref, sys),
[userPref, sys]
);

const theme = effectiveMode === "dark" ? dark : light;

const updateUserPref = useCallback(async (pref: UserPref) => {
setUserPref(pref);
await AsyncStorage.setItem(STORAGE_KEY, pref);
}, []);

const val = useMemo(
() => ({ theme, userPref, effectiveMode, updateUserPref }),
[theme, userPref, effectiveMode, updateUserPref]
);

return {children};
};

export default ThemeProvider;
Вопрос
Почему симуляторы iOS и Android запускают Hermes OOM до монтирования React?

Известна ли это ошибка с Expo SDK 54 + RN 0.81 + Hermes на симуляторах?

Что мне следует делать или попытаться определить корень проблемы?

Подробнее здесь: https://stackoverflow.com/questions/798 ... oth-ios-an
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»