Я испытываю некоторые сбои памяти при работе.Пытаясь изолировать проблему, я мог бы создать небольшое приложение, чтобы воспроизвести проблему.
import React from 'react';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
export default class App extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
render() {
const { count } = this.state;
const extraContent = new Array(200 * count).fill().map((_, index) => (
<View key={index}><Text>Line {index}</Text></View>
));
return (
<View style={styles.container}>
<View style={styles.actions}>
<TouchableOpacity onPress={() => this.setState({ count: count + 1})}>
<View style={styles.button}>
<Text style={styles.buttonText}>Add</Text>
</View>
</TouchableOpacity>
<TouchableOpacity onPress={() => count > 0 && this.setState({ count: count - 1})}>
<View style={styles.button}>
<Text style={styles.buttonText}>Remove</Text>
</View>
</TouchableOpacity>
</View>
<View>
<Text>Current count: {count}</Text>
<View>{extraContent}</View>
</View>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
marginTop: 50,
width: '100%',
},
actions: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-around',
},
buttonText: {
color: '#ffffff',
},
button: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: '#95afe5',
height: 50,
width: 100,
marginBottom: 5,
borderRadius: 5,
},
});
Код добавляет и удаляет некоторые виды с экрана при нажатии и или удалении.Ожидается, что нажатие Add
три раза и затем Remove
три раза приведет к тому же объему памяти.Что действительно происходит, так это то, что часть памяти не высвобождается, как показано на графике:
Интересно, что добавление трех раз и удаление трехраз пиковое потребление памяти ниже, чем в первом раунде, и нет утечки, но если мы изменим, чтобы добавить / удалить пять раз, это дополнительная псевдо утечка.
Я называю это псевдо утечкой, потому что время от времени мог понять, почему освобождается значительная часть этой сохраненной памяти, но она никогда не возвращается к исходному базовому уровню.Это заставляет меня поверить, что этот эффект может быть не фактической утечкой, а чем-то вроде кеша.
В моем производственном приложении этот эффект достиг 150+ МБ, что приводит к сбоям OOM на устройствах с 1 ГБ ОЗУ.
Кто-нибудь знает, что это такое и есть ли способ избежать такого поведения?