Аномальное потребление памяти при указании различных applicationId. Что делать?

Напоролся на непонятную вещь. Заглянул в Android Monitor посмотреть потребление памяти, по непонятной причине память ровно и медленно текла с 9 М до 15 М, следовала очистка мусорщиком и по новой. В приложении в этот момент ничего не происходило. Кусок за куском комментировал код в поисках утечки. И дошёл до предела - чистая активити и манифест. Память по прежнему текла.

Создал в студии по шаблону чистое приложение с applicationId выбранным наобум. Запускаю, память стоит как вкопанная. Перетащил всё из примера в свой проект, память по прежнему течёт с тем же характером.

Дальше пошёл крышеснос. В этом свежеиспечённом девственном тестовом проекте (!) в defaultConfig заменяю applicationId на id из рабочего проекта. Твою дивизию, память потекла! Причём один в один.
Заменяю applicationId обратно - память стоит. И так несколько раз.

Рабочий проект был вчера залит альфой на плей. Подумалось, что возможно гугл как-то что-то присоединяет на устройстве к моему процессу для проектов из плея для оценки поведения (ну а что ещё тут думать можно?) . Стал пробовать менять на другие id своих опубликованных проектов и смотреть потребление. Память стоит. Скачет только при одном конкретном имени пакета.

// applicationId "com.*****.swf"// 10.79
// applicationId "com.*****.*****off"// 8.47-15
// applicationId "com.*****.*****lock.free"// 9.04 | 11.12 | 9.65
// applicationId "com.*****.*****lockplus"// 10.41 | 11.30
   applicationId "com.*****.*****_off"// 11.43 | 9.99-7.83


Что интересно, например, приложение с именем пакета с swf стабильно потребляло 10,79. Проверял на перезапусках. Потребление с другими именами пакетов тоже видно. И то самое невезучее имя "com.*****.*****off", с которго всё началось.

Методом тыка остановился на имени пакета "com.*****.*****_off". Оно либо стабильно стоит на 11.4 Мб, либо падает до 7.8 Мб и остаётся на нём. Достаточно было только добавить символ _.

Всё это на 6-м Андроиде (LG) и самой новой стабильной студией 2.2.3. Приложение из шаблона студии - "Basic Activity".

apply plugin: 'com.android.application'

android {
	compileSdkVersion 25
	buildToolsVersion "25.0.2"
	defaultConfig {
		applicationId "com.*****.*****_off"
		minSdkVersion 21
		targetSdkVersion 25
		versionCode 1
		versionName "1.0"
		testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
	}
	buildTypes {
		release {
			minifyEnabled false
			proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
		}
	}
}

dependencies {
	compile fileTree(dir: 'libs', include: ['*.jar'])
	androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
		exclude group: 'com.android.support', module: 'support-annotations'
	})
	compile 'com.android.support:appcompat-v7:25.1.0'
	compile 'com.android.support:design:25.1.0'
	testCompile 'junit:junit:4.12'
}

Картинки потребления памяти одного и того же пустого приложения.

со "скачущим" именем пакета: "com.*****.*****off"
677c472ef3d5467c86edef3d8a297856.jpg

с именем пакета: "com.*****.swf"
f136c65641354faf92849e36e41c5617.jpg

UPD. В одном эксперименте у скачещего инстанса заменил имя вживую (с "com.*****.*****off" на "com.*****.swf"), без перезапуска, как это умеет студия, и постепенно очистка за очисткой мусорщиком память упала до 8,5 Мб и успокоилась. Это видно на картинке ниже.

3c626139371a4974a0b7ca488077e637.jpg
  • Вопрос задан
  • 233 просмотра
Пригласить эксперта
Ответы на вопрос 2
@xotta6bl4
Память течет - это когда она выделяется но не освобождается, например где-то держим ссылку на активити. Повернули устройство - текущая активити остановлена, запущена еще раз, но в другой ориентации. По идее старый инстанс активити должен быть удален из памяти, но ссылка не дает GC сделать это. Многократные повороты устройства приведут к тому, что у вас в памяти будет много инстансов активити. А у вас не утечка, а нормальный режим работы приложения.

Кто есть память? Мониторинг потребления памяти и ест ее. А потом освобождает. Это нормально. Точно также счетчик фпс снижает фпс. С другой стороны мне не очень понятно, почему при некоторых package name память расходуется меньше. Я бы посмотрел дампы и аллокации.
Ответ написан
  • В студии, прямо там, где память, есть кнопочка "Start Allocation Tracking". Этот инструмент показывает какие инстансы создаются.
  • При приближению к пиковому значению можно снять дамп памяти и разобраться, кто больше всех съедает.
  • А еще можно попробовать запустить на чистом эмуляторе и снова все прогнать. Может на девайсе root? Вирусы? Антивирусы?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы