2011-08-18 30 views
5

Tôi có yêu cầu phải kiểm tra các dòng no.of trong Tệp 'A' và nếu Tệp 'A' vượt quá giới hạn của tôi thì tôi cần sao chép nội dung của nó vào tệp khác ' B 'và sau đó xóa nội dung của tập tin' A '.cách ngăn ngừa các câu lệnh GC_CONCURRENT trong Logcat

Nhiệm vụ trên tôi phải thực hiện tất cả các lần Vì vậy, tôi đã xây dựng "Dịch vụ" để thực hiện tác vụ này. (Tôi muốn chạy cái này ở mặt sau).

Từ Dịch vụ, tôi khởi chạy một chuỗi để thực thi tác vụ trên. (Tôi có nhiệm vụ khác trong Dịch vụ sẽ chạy song song cùng với tác vụ).

Tôi đang sử dụng AlarmManager để giữ "Dịch vụ" của tôi còn hoạt động.

Điểm mấu chốt là nhiệm vụ trên sẽ luôn hoạt động. Cho đến nay tôi đã thành công trong những gì tôi muốn đạt được.

Nhưng tôi đã quan sát thấy trong đầu ra LogCat rằng nó tạo ra các câu lệnh rất lớn liên quan đến GC.

Giống như:

D/dalvikvm(2579): GC_CONCURRENT freed 483K, 62% free 2608K/6727K, external 1628K/2108K, paused 2ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 469K, 62% free 2608K/6727K, external 1628K/2108K, paused 34ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 466K, 62% free 2608K/6727K, external 1628K/2108K, paused 1ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 472K, 62% free 2609K/6727K, external 1628K/2108K, paused 7ms+2ms 
D/dalvikvm(2579): GC_CONCURRENT freed 473K, 62% free 2607K/6727K, external 1628K/2108K, paused 2ms+1ms 
D/dalvikvm(2579): GC_CONCURRENT freed 473K, 62% free 2607K/6727K, external 1628K/2108K, paused 1ms+2ms 
D/dalvikvm( 263): GC_EXPLICIT freed 351K, 58% free 3118K/7303K, external 10278K/11844K, paused 42ms 

tôi nghi ngờ ứng dụng của tôi bị rò rỉ một số bộ nhớ hoặc nó được tiêu thụ bộ nhớ nặng. về hiệu suất tôi muốn tránh điều này. Dưới đây là đoạn mã mà tôi đang chạy tất cả thời gian trong chuỗi.

public void run() 
{ 
    while (true) { 
     if (WifiLogCollector.stoopThread) 
      return; 
     LineNumberReader lineNumberReader = new LineNumberReader(new FileReader(textfile)); 
     lineNumberReader.skip(Long.MAX_VALUE); 

     if ((lineNumberReader.getLineNumber()) > 20000) { 

      FileChannel source = null; 
      FileChannel destination = null; 

      try { 
       source = new FileInputStream("/mnt/sdcard/textfile.txt").getChannel(); 
       destination = new FileOutputStream("/mnt/sdcard/textbackupfile.txt") 
           .getChannel(); 
       destination.transferFrom(source, 0, source.size()); 
      } finally { 
       if (source != null) { 
        source.close(); 
        source = null; 
       } 
       if (destination != null) { 
        destination.close(); 
        destination = null; 
       } 
      } 

      PrintWriter writer = new PrintWriter(/mnt/sdcard/textfile.txt); 
      writer.print(""); 
      writer.close(); 
      writer = null; 

     } 

     lineNumberReader.close(); 
     lineNumberReader = null; 
    } 
} 

ở trên là phương thức run() của chuỗi của tôi.

Hãy giúp tôi những thay đổi tôi cần làm trong thiết kế của mình để tránh nhật ký GC và làm cho bộ nhớ ứng dụng của tôi hiệu quả.

Trả lời

5

Bạn đang tạo quá nhiều đối tượng "mới" trong vòng lặp của bạn, điều này làm cho GC chạy tự động làm sạch chúng sau khi bạn đã vô hiệu hóa chúng. Bạn muốn biến chúng thành các biến lớp tĩnh, không phải các biến cục bộ mới để bạn có thể tiếp tục sử dụng các đối tượng giống nhau.

+0

Nếu tôi đang sử dụng từ khóa 'static', nó có ngăn chặn' GC_CONCURRENT' để giảm bộ nhớ ảo có sẵn, giá trị chuỗi hoặc hình ảnh để ứng dụng chạy lâu hơn không? –

Các vấn đề liên quan