質問編集履歴

10

不要な情報の削除

2018/05/13 08:00

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
@@ -20,18 +20,6 @@
20
20
 
21
21
 
22
22
 
23
- ##アプリ処理の詳細
24
-
25
- データを取得したら固定長のclassに入れてから、可変長のListArrayに入れています。
26
-
27
- ListArrayからは`iterator`を使用して取得し、その後`remove`で破棄しています。
28
-
29
- (アプリではグラフ表示やファイル出力も行っていますが、
30
-
31
- 問題切り分けの為に表示と出力は止めて、データ取得と破棄だけでNative領域が増えることを確認しています。)
32
-
33
-
34
-
35
23
  #確認したこと
36
24
 
37
25
  ・「Dump Java heap」を使用して「Arrange by package」にして「com\example\アプリ名」からアプリが使用しているメモリが増えていないことを確認しました。

9

ソースコード修正

2018/05/13 08:00

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
@@ -64,6 +64,8 @@
64
64
 
65
65
  ファイル保存時に明示的に開放する物などはありますでしょうか?
66
66
 
67
+ ※5/10に一部修正し、処理を軽くしても再現することを確認しました。
68
+
67
69
 
68
70
 
69
71
  ```Java
@@ -264,7 +266,9 @@
264
266
 
265
267
  }
266
268
 
269
+ // 5/10 handler.postDelayed(this,10); // 10ms間隔で実行
270
+
267
- handler.postDelayed(this,10); // 10ms間隔で実行
271
+ handler.postDelayed(this,100); // 100ms間隔で実行
268
272
 
269
273
  }
270
274
 
@@ -312,11 +316,11 @@
312
316
 
313
317
  BufferedWriter bw = new BufferedWriter(osw);
314
318
 
315
- for(int i = 0; i < 15000; i++) {
316
-
317
- bw.write(str); // 15000個同じ値を並べる
319
+ // 5/10 for(int i = 0; i < 15000; i++) { // 15000個同じ値を並べる
318
-
320
+
319
- }
321
+ bw.write(str);
322
+
323
+ // 5/10 }
320
324
 
321
325
  bw.write("\r\n"); // 改行(Windows用)
322
326
 

8

日付入力

2018/05/10 14:02

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
 
58
58
 
59
- #【追記】現象が再現するソースコード
59
+ #【5/9 追記】現象が再現するソースコード
60
60
 
61
61
  ボタンを押すと、内部ストレージの`/test`フォルダにファイルを保存し続けます。
62
62
 

7

xml追加

2018/05/09 11:20

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
@@ -351,3 +351,89 @@
351
351
 
352
352
 
353
353
  ```
354
+
355
+
356
+
357
+ ```xml
358
+
359
+ <?xml version="1.0" encoding="utf-8"?>
360
+
361
+ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
362
+
363
+ xmlns:tools="http://schemas.android.com/tools"
364
+
365
+ android:layout_width="match_parent"
366
+
367
+ android:layout_height="match_parent"
368
+
369
+ android:orientation="vertical"
370
+
371
+ android:gravity="center_horizontal"
372
+
373
+ tools:context=".MainActivity">
374
+
375
+
376
+
377
+ <LinearLayout
378
+
379
+ android:orientation="horizontal"
380
+
381
+ android:gravity="center"
382
+
383
+ android:layout_width="match_parent"
384
+
385
+ android:layout_height="wrap_content">
386
+
387
+
388
+
389
+ <Button
390
+
391
+ android:id="@+id/button_save"
392
+
393
+ android:text="@string/save_file"
394
+
395
+ android:layout_margin="20dp"
396
+
397
+ android:textSize="20sp"
398
+
399
+ android:layout_width="wrap_content"
400
+
401
+ android:layout_height="wrap_content" />
402
+
403
+ </LinearLayout>
404
+
405
+
406
+
407
+ <TextView
408
+
409
+ android:id="@+id/text_view1"
410
+
411
+ android:textSize="30sp"
412
+
413
+ android:textColor="#000"
414
+
415
+ android:layout_margin="20sp"
416
+
417
+ android:layout_width="wrap_content"
418
+
419
+ android:layout_height="wrap_content" />
420
+
421
+
422
+
423
+ <TextView
424
+
425
+ android:id="@+id/text_view2"
426
+
427
+ android:textSize="30sp"
428
+
429
+ android:textColor="#000"
430
+
431
+ android:layout_margin="20sp"
432
+
433
+ android:layout_width="wrap_content"
434
+
435
+ android:layout_height="wrap_content" />
436
+
437
+ </LinearLayout>
438
+
439
+ ```

6

主語が抜けていた

2018/05/09 08:34

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
@@ -60,7 +60,7 @@
60
60
 
61
61
  ボタンを押すと、内部ストレージの`/test`フォルダにファイルを保存し続けます。
62
62
 
63
- 下記コードを実行すると、GCボタンを押してもNativeメモリが減りませんが、
63
+ 下記コードを実行すると、AndroidProfilerのGCボタンを押してもNativeメモリが減りませんが、
64
64
 
65
65
  ファイル保存時に明示的に開放する物などはありますでしょうか?
66
66
 

5

誤字修正

2018/05/09 08:22

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
@@ -58,7 +58,7 @@
58
58
 
59
59
  #【追記】現象が再現するソースコード
60
60
 
61
- ボタンを押すと、内部ストレージの`/test`フォルダにファイルを保存し続けています。
61
+ ボタンを押すと、内部ストレージの`/test`フォルダにファイルを保存し続けます。
62
62
 
63
63
  下記コードを実行すると、GCボタンを押してもNativeメモリが減りませんが、
64
64
 

4

現象が再現するソースコードの追加

2018/05/09 08:17

投稿

Wind
Wind

スコア442

test CHANGED
@@ -1 +1 @@
1
- AndroidのNativeメモリが増え続ける原因と解決方法について
1
+ 連続ファイル保存時に、AndroidのNativeメモリが増え続ける原因と解決方法について
test CHANGED
@@ -53,3 +53,301 @@
53
53
  投げっぱなしになってしまいますが、AndroidのNativeメモリが増え続ける原因が思いつきませんので、調べる方法と解決方法が知りたいです。
54
54
 
55
55
  もしくは他にやってみた方がいいことだけでも教えていただけないでしょうか。
56
+
57
+
58
+
59
+ #【追記】現象が再現するソースコード
60
+
61
+ ボタンを押すと、内部ストレージの`/test`フォルダにファイルを保存し続けています。
62
+
63
+ 下記コードを実行すると、GCボタンを押してもNativeメモリが減りませんが、
64
+
65
+ ファイル保存時に明示的に開放する物などはありますでしょうか?
66
+
67
+
68
+
69
+ ```Java
70
+
71
+ public class MainActivity extends AppCompatActivity {
72
+
73
+
74
+
75
+ private static final int REQUEST_EXTERNAL_STORAGE = 1;
76
+
77
+ private static String[] PERMISSIONS_STORAGE = {
78
+
79
+ Manifest.permission.READ_EXTERNAL_STORAGE,
80
+
81
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
82
+
83
+ };
84
+
85
+
86
+
87
+ public static void verifyStoragePermissions(Activity activity) {
88
+
89
+ int writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
90
+
91
+ int readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
92
+
93
+
94
+
95
+ if (writePermission != PackageManager.PERMISSION_GRANTED || readPermission != PackageManager.PERMISSION_GRANTED) {
96
+
97
+ ActivityCompat.requestPermissions(
98
+
99
+ activity,
100
+
101
+ PERMISSIONS_STORAGE,
102
+
103
+ REQUEST_EXTERNAL_STORAGE
104
+
105
+ );
106
+
107
+ }
108
+
109
+ }
110
+
111
+
112
+
113
+ private TextView textView1;
114
+
115
+ private TextView textView2;
116
+
117
+
118
+
119
+ public static final String TAG = "MainActivity";
120
+
121
+ private String fileName1 = "test1";
122
+
123
+ private String fileName2 = "test2";
124
+
125
+ private String strFileName1; // 保存ファイル名(フルパス)
126
+
127
+ private String strFileName2; // 保存ファイル名(フルパス)
128
+
129
+
130
+
131
+ private int intRaw = 0;
132
+
133
+ private int intFileNumber = 0;
134
+
135
+ private boolean bolTimerFlag = false; // タイマー実行フラグ
136
+
137
+
138
+
139
+ @Override
140
+
141
+ protected void onCreate(Bundle savedInstanceState) {
142
+
143
+ super.onCreate(savedInstanceState);
144
+
145
+ setContentView(R.layout.activity_main);
146
+
147
+ verifyStoragePermissions(this);
148
+
149
+
150
+
151
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // スマホ画面を自動スリープさせない
152
+
153
+
154
+
155
+ textView1 = findViewById(R.id.text_view1);
156
+
157
+ textView2 = findViewById(R.id.text_view2);
158
+
159
+
160
+
161
+ // ファイル作成ボタン
162
+
163
+ Button buttonSave = findViewById(R.id.button_save);
164
+
165
+ buttonSave.setOnClickListener(new View.OnClickListener() {
166
+
167
+ @Override
168
+
169
+ public void onClick(View v) {
170
+
171
+ if(bolTimerFlag == false)
172
+
173
+ {
174
+
175
+ handler.post(r); // 実行
176
+
177
+ bolTimerFlag = true;
178
+
179
+ Log.i(TAG,"Timer Run");
180
+
181
+ }
182
+
183
+ else
184
+
185
+ {
186
+
187
+ handler.removeCallbacks(r); // キャンセル
188
+
189
+ bolTimerFlag = false;
190
+
191
+ mediaScan(); // 途中のファイルをメディアスキャン
192
+
193
+ Log.i(TAG,"Timer Stop");
194
+
195
+ }
196
+
197
+ }
198
+
199
+
200
+
201
+ // 定期的に実行
202
+
203
+ // https://qiita.com/aftercider/items/81edf35993c2df3de353
204
+
205
+ final Handler handler = new Handler();
206
+
207
+ final Runnable r = new Runnable() {
208
+
209
+ @Override
210
+
211
+ public void run() {
212
+
213
+
214
+
215
+ strFileName1 = Environment.getExternalStorageDirectory().getPath() + "/test/" + fileName1 + " " + String.format("%04d",intFileNumber) + ".csv"; // 内部ストレージ直下のtestフォルダ
216
+
217
+ strFileName2 = Environment.getExternalStorageDirectory().getPath() + "/test/" + fileName2 + " " + String.format("%04d",intFileNumber) + ".csv"; // 内部ストレージ直下のtestフォルダ
218
+
219
+
220
+
221
+ String text = "test" + intRaw + ","; // 保存する内容
222
+
223
+ StringBuilder sb = new StringBuilder();
224
+
225
+ if(intRaw % 2 == 0)
226
+
227
+ {
228
+
229
+ saveFile(strFileName1, text);
230
+
231
+ sb.append("Saved:").append(intRaw).append("偶数");
232
+
233
+ }else
234
+
235
+ {
236
+
237
+ saveFile(strFileName2, text);
238
+
239
+ sb.append("Saved:").append(intRaw).append("奇数");
240
+
241
+ }
242
+
243
+ textView1.setText(sb.toString());
244
+
245
+
246
+
247
+ intRaw++;
248
+
249
+
250
+
251
+ if(intRaw >= 200)
252
+
253
+ { // 100行ずつのファイルを作成
254
+
255
+ mediaScan(); // 完了したファイルをメディアスキャン
256
+
257
+
258
+
259
+ intRaw = 0; // 行数をクリア
260
+
261
+ intFileNumber++; // 次のファイルを作成
262
+
263
+ textView2.setText("Files:" + intFileNumber);
264
+
265
+ }
266
+
267
+ handler.postDelayed(this,10); // 10ms間隔で実行
268
+
269
+ }
270
+
271
+ };
272
+
273
+ });
274
+
275
+ }
276
+
277
+
278
+
279
+ // メディアスキャン
280
+
281
+ private void mediaScan()
282
+
283
+ {
284
+
285
+ String[] paths = {strFileName1, strFileName2};
286
+
287
+ String[] mimeTypes = {"text/csv", "text/csv"};
288
+
289
+ MediaScannerConnection.scanFile(getApplicationContext(), paths, mimeTypes, null); // メディアスキャン
290
+
291
+ }
292
+
293
+
294
+
295
+
296
+
297
+ // ファイルを保存
298
+
299
+ private synchronized void saveFile(final String file, final String str) {
300
+
301
+ new Thread(new Runnable() {
302
+
303
+ @Override
304
+
305
+ public void run() {
306
+
307
+ try {
308
+
309
+ FileOutputStream fos = new FileOutputStream(file,true); // 追記
310
+
311
+ OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
312
+
313
+ BufferedWriter bw = new BufferedWriter(osw);
314
+
315
+ for(int i = 0; i < 15000; i++) {
316
+
317
+ bw.write(str); // 15000個同じ値を並べる
318
+
319
+ }
320
+
321
+ bw.write("\r\n"); // 改行(Windows用)
322
+
323
+ bw.flush();
324
+
325
+ bw.close();
326
+
327
+ Log.i(TAG,"Saved:" + str);
328
+
329
+
330
+
331
+
332
+
333
+ } catch (FileNotFoundException e) {
334
+
335
+ Log.d(TAG, "Error:" + e.toString());
336
+
337
+ } catch (IOException e) {
338
+
339
+ Log.d(TAG, "Error:" + e.toString());
340
+
341
+ }
342
+
343
+ }
344
+
345
+ }).start();
346
+
347
+ }
348
+
349
+ }
350
+
351
+
352
+
353
+ ```

3

現象をより具体的に記入

2018/05/09 08:10

投稿

Wind
Wind

スコア442

test CHANGED
@@ -1 +1 @@
1
- AndroidのNativeメモリが増える原因と解決方法について
1
+ AndroidのNativeメモリが増え続ける原因と解決方法について
test CHANGED
@@ -50,6 +50,6 @@
50
50
 
51
51
  #知りたいこと
52
52
 
53
- 投げっぱなしになってしまいますが、AndroidのNativeメモリが増えている原因が思いつきませんので、調べる方法と解決方法が知りたいです。
53
+ 投げっぱなしになってしまいますが、AndroidのNativeメモリが増え続ける原因が思いつきませんので、調べる方法と解決方法が知りたいです。
54
54
 
55
55
  もしくは他にやってみた方がいいことだけでも教えていただけないでしょうか。

2

タイトルに環境の追加

2018/05/09 02:55

投稿

Wind
Wind

スコア442

test CHANGED
@@ -1 +1 @@
1
- Nativeメモリが増える原因と解決方法について
1
+ AndroidのNativeメモリが増える原因と解決方法について
test CHANGED
@@ -50,6 +50,6 @@
50
50
 
51
51
  #知りたいこと
52
52
 
53
- 投げっぱなしになってしまいますが、Nativeメモリが増えている原因が思いつきませんので、調べる方法と解決方法が知りたいです。
53
+ 投げっぱなしになってしまいますが、AndroidのNativeメモリが増えている原因が思いつきませんので、調べる方法と解決方法が知りたいです。
54
54
 
55
55
  もしくは他にやってみた方がいいことだけでも教えていただけないでしょうか。

1

1ヶ月経っても回答が何も無い為

2018/05/09 02:54

投稿

Wind
Wind

スコア442

test CHANGED
File without changes
test CHANGED
File without changes