Реакция Нативная псевдопроникающая память после удаления элементов с экрана (ios) - программирование
Подтвердить что ты не робот

Реакция Нативная псевдопроникающая память после удаления элементов с экрана (ios)

Я испытываю некоторые сбои памяти в производстве. Пытаясь изолировать проблему, я мог бы сделать небольшое приложение, чтобы воспроизвести проблему.

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 три раза" закончится тем же объемом использования памяти. Что действительно происходит, так это то, что некоторая память не выводится, как показано на графике:

enter image description here

Интересно, что повторное добавление три раза и удаление в три раза пика потребления памяти ниже, чем в первом раунде, и там нет утечки, но если мы изменим, чтобы добавить/удалить пять раз, есть дополнительная псевдопротека.

enter image description here

Я называю это псевдо-утечкой, потому что время от времени можно понять, почему большая часть этой сохраненной памяти освобождена, но она никогда не возвращается к исходной базовой линии. Это заставляет меня думать, что этот эффект может быть не фактической утечкой, а каким-то кешем.

В моем рабочем приложении этот эффект достиг 150+ MB, что приводит к сбоям OOM на устройствах с 1 ГБ ОЗУ.

Кто-нибудь знает, что это такое, и есть ли способ избежать такого поведения?

4b9b3361