Я испытываю некоторые сбои памяти в производстве. Пытаясь изолировать проблему, я мог бы сделать небольшое приложение, чтобы воспроизвести проблему.
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+ MB, что приводит к сбоям OOM на устройствах с 1 ГБ ОЗУ.
Кто-нибудь знает, что это такое, и есть ли способ избежать такого поведения?