2009-03-20 26 views
6

Tôi có ứng dụng Flex & Papervision3D khá lớn, tạo và phá hủy các đối tượng liên tục. Nó cũng tải và dỡ bỏ các tệp tài nguyên SWF. Trong khi nó chạy SWF từ từ tiêu thụ bộ nhớ đến khoảng 2GB khi nó croaks người chơi. Rõ ràng là tôi khá chắc chắn tôi cho đi tham chiếu đến các trường hợp tôi không còn muốn với kỳ vọng GC sẽ làm công việc của mình. Nhưng tôi đang có một thời gian để tìm ra vấn đề nằm ở đâu.Gỡ lỗi rò rỉ bộ nhớ FLEX/AS3

Tôi đã thử sử dụng profiler và các tùy chọn của nó để chụp ảnh chụp nhanh bộ nhớ, v.v. - nhưng vấn đề của tôi vẫn còn lảng tránh. Tôi nghĩ rằng có những vấn đề được biết đến bằng cách sử dụng trình gỡ lỗi Flash cũng? Nhưng tôi cũng không thấy vui khi sử dụng phiên bản phát hành.

Bạn làm cách nào để theo dõi vấn đề rò rỉ bộ nhớ bằng FLEX/AS3? Một số chiến lược, thủ thuật hoặc công cụ bạn đã sử dụng để định vị tiêu thụ

Trả lời

3

tôi stumbled trên một cái gì đó giải thích làm thế nào để sử dụng Flex Profiler trong Flex Builder và đó là một sự giúp đỡ rất lớn cho tôi trong gỡ lỗi rò rỉ bộ nhớ. Tôi chắc chắn sẽ đề nghị thử nó. Nó rất dễ sử dụng. Một số điều tôi đã tìm thấy khi lược tả các ứng dụng của mình:

Tránh sử dụng các bộ sưu tập (ít nhất là các bộ sưu tập LỚN) làm các thuộc tính của Các đối tượng giá trị. Tôi đã có một số loại Lớp đối tượng giá trị trong ứng dụng Cairngorm của tôi và mỗi loại có thuộc tính "con" là ArrayCollection và được sử dụng để lọc. Khi profiling, tôi thấy rằng đây là một trong những người ăn nhớ lớn nhất của tôi, vì vậy tôi thay đổi ứng dụng của tôi để thay vì lưu trữ "parentId" như là một int và sử dụng để lọc. Bộ nhớ được sử dụng đã được cắt giảm đáng kể. Một cái gì đó như thế này:

Cũ cách:

public class Owner1 
{ 
    public var id:int; 
    public var label:String; 
    public var children:ArrayCollection; // Stores any number of Owner2 Objects 
} 

public class Owner2 
{ 
    public var id:int; 
    public var label:String; 
    public var children:ArrayCollection; // Stores any number of Owner3 Objects 
} 

public class Owner3 
{ 
    public var id:int; 
    public var label:String; 
} 

New Way:

public class Owner1 
{ 
    public var id:int; 
    public var label:String; 
} 

public class Owner2 
{ 
    public var id:int; 
    public var label:String; 
    public var parentId:int; // Refers to id of Owner1 Object 
} 

public class Owner3 
{ 
    public var id:int; 
    public var label:String; 
    public var parentId:int; // Refers to id of Owner2 Object 
} 

Tôi cũng xin đề nghị loại bỏ người nghe sự kiện khi họ không còn cần thiết.

2

Nếu rò rỉ bộ nhớ của bạn tăng theo cấp số nhân, điều đó có nghĩa là GC không thực hiện được công việc của mình. Hãy xem mã của bạn và xem bất cứ nơi nào bạn có thể giảm số lượng tham chiếu của đối tượng (bằng cách đặt chúng thành null). Làm cho trình xử lý sự kiện yếu. Và tái cấu hình.

4

Tôi thường triển khai phương pháp dọn dẹp trong mỗi lớp tôi tạo (vì AS không có trình phá hủy). Vấn đề chính tôi đã nhận thấy với GC là với người nghe sự kiện. Bổ sung vào những gì dirkgently nói, cũng cố gắng tránh các chức năng nghe nặc danh (như bạn không thể loại bỏ chúng một cách rõ ràng). Dưới đây là một số liên kết bạn có thể thấy hữu ích:

+0

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/arguments.html#callee – Jotham

3

vì các vấn đề như thế này tôi đã phát triển một thư viện nguồn mở giúp theo dõi tất cả các sự kiện bạn đang chạy tại bất kỳ thời điểm nào. nó thực sự dễ dàng để thực hiện và tôi đã tái yếu tố dự án trong 10-15 phút chuyển đổi chúng để sử dụng EventController tôi đã phát triển.

về cơ bản cho kịch bản của bạn, tôi sẽ chạy qua tất cả các sự kiện và thay thế chúng từ: obj.addEventListener (...);

tới: EC.add (obj, ...);

phần còn lại cũng giống như những gì sẽ làm là đăng ký sự kiện và làm cho nó trở nên dễ dàng để xem tất cả các sự kiện của bạn tại bất kỳ thời điểm nào bạn muốn sử dụng EC.log();

tất cả chi tiết và tài liệu trên trang web của tôi tôi rất muốn biết liệu điều này có giúp ích cho bạn hay không và liệu bạn có bắt đầu làm việc với nó hay không. nếu bạn có bất kỳ thông tin phản hồi tốt hay xấu xin vui lòng gửi nó lên và tôi sẽ xem xét nó!

trang web là: http://fla.as/ec/