2009-06-26 31 views
6

Chúng tôi đang triển khai một ứng dụng trên thiết bị được bán nhúng có các ràng buộc về bộ nhớ. Tìm cách để tiết kiệm bất cứ điều gì chúng ta có thể chúng tôi đang phân tích đống đống của ứng dụng và tấn công người tiêu dùng lớn nhất.Làm cách nào để định cấu hình Spring để tiết kiệm bộ nhớ nhiều nhất có thể?

Chúng tôi sử dụng Spring 2.5 cùng với Spring DM 1.1 và chúng tôi nhận thấy rằng một số gói của chúng tôi có bối cảnh mùa xuân phức tạp hơn đang sử dụng khá nhiều bộ nhớ kể từ khi mùa xuân dường như giữ xung quanh toàn bộ đồ thị chứa tất cả các BeanDefinition phân tích cú pháp từ XML. Tôi cho rằng hầu hết điều này là không cần thiết khi ứng dụng đã được khởi tạo và mọi thứ được tiêm.

Có các tùy chọn cấu hình cho Spring cho phép một tùy chọn kiểm soát hành vi này không? Chạy ở một số chế độ bộ nhớ thấp? Vứt bỏ mọi thứ không cần thiết? Thời gian tính toán thương mại cho kích thước?

Trả lời

5

Tôi đã có các thành viên trong nhóm có cái nhìn sâu hơn về điều này và có một số kết quả thú vị. Mùa xuân trong cấu hình mặc định của nó là rất nhiều không quan tâm đến việc đặc biệt thận trọng trong việc sử dụng bộ nhớ của nó. Có 2 khía cạnh cơ bản có thể được tinh chỉnh cho lợi ích quan trọng:

  • Đầu tiên là một tài sản không tiếp xúc với bên mùa xuân OsgiBundleXmlApplicationContext mà bạn có thể ghi đè nếu bạn mở rộng từ lớp đó và ghi đè lên các phương pháp customizeBeanFactory.

Chúng tôi đã làm điều đó như thế này:

@Override 
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) { 
    super.customizeBeanFactory(beanFactory); 
    String cacheBeanMetadataSysProp = System.getProperty(CACHE_BEAN_METADATA, "true"); 
    if (cacheBeanMetadataSysProp != null 
     && cacheBeanMetadataSysProp.equalsIgnoreCase("false")) { 
     beanFactory.setCacheBeanMetadata(false); 
    } else if (cacheBeanMetadataSysProp != null 
     && cacheBeanMetadataSysProp.equalsIgnoreCase("true")) { 
     beanFactory.setCacheBeanMetadata(true); 
    } 
} 

Thiết lập "setCacheBeanMetadata" tài sản để false làm cho BeanDefinitions (về cơ bản là gương chương trình cấu hình dựa trên XML của bạn) để được bỏ đi sau khi khởi tạo.

  • Thay đổi thứ hai - mà chúng tôi hiện có mẫu thử - là bản vá cho mã nguồn Spring để khởi tạo bộ sưu tập chậm. Nó chỉ ra rằng nhiều đối tượng Spring bên trong đại diện cho Beans và tất cả các thuộc tính của chúng có rất nhiều thành viên được khởi tạo HashMaps và các bộ sưu tập khác theo mặc định nhưng rất hiếm khi được lấp đầy dữ liệu. Việc thay đổi khung công tác Spring để khởi tạo những lazily này sẽ tiết kiệm được một lượng bộ nhớ đáng kể nhưng nó là một thay đổi xâm lấn hơn nhiều.
1

Bạn có thể lưu một số bộ nhớ với một BeanFactory - xem 3.8.1. BeanFactory or ApplicationContext:

Khi ApplicationContext bao gồm tất cả chức năng của BeanFactory, nó thường được khuyến cáo rằng nó được sử dụng trong ưu tiên cho BeanFactory, trừ một vài tình huống giới hạn như trong một Applet, nơi tiêu thụ bộ nhớ có thể rất quan trọng và một vài kilobyte thừa có thể tạo ra sự khác biệt.

+0

Viết lại tất cả các định nghĩa ngữ cảnh ứng dụng của chúng tôi là yêu cầu BeanFactory bắt buộc trong Java không phải là một tùy chọn. –

0

Tôi không biết bất kỳ cách nào để làm cho Spring chạy ở chế độ "nhẹ". Bạn có thể thử thực hiện một BeanFactoryPostProcessor và sử dụng nó để loại bỏ các bean nhất định khỏi ngữ cảnh. Tôi không có ý tưởng cho dù đó là sẽ dẫn đến lỗi Spring nội bộ tuy nhiên.

+0

Đó là những gì tôi đã sợ, tôi sẽ tiếp tục mở câu hỏi thêm vài ngày nữa. –

0

Nếu bạn chỉ sử dụng mùa xuân lúc khởi động, tức tất cả đậu đang có dây và sau đó bạn không cần phải bối cảnh ứng dụng hoặc logic tắt máy, bạn có thể bắt đầu ứng dụng của bạn và sau đó rõ ràng tất cả các tài liệu tham khảo với bối cảnh ứng dụng .

+0

Bản thân Spring giữ tham chiếu đến ngữ cảnh ứng dụng, chúng tôi không làm rõ ràng. Tôi không chắc chắn chúng tôi có thể loại bỏ những tham chiếu nào. –

0

Nếu cấu hình Spring của bạn sử dụng AOP và thời gian tải dệt, bạn có thể sử dụng aop.xml để lấy lại một số bộ nhớ từ AspectJ bằng cách sử dụng tính năng loại bỏ AspectJ được giới thiệu trong 1.6.5.

<weaver options="-Xset:typeDemotion=true"/> 

Phân tích heap của bạn, nếu bạn tìm thấy nhiều đối tượng RefType, mẹo trên sẽ hữu ích.

+0

Chúng tôi không sử dụng AOP nhưng cảm ơn cho mẹo! –

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