2011-03-23 2 views
0

잠시 jruby에 개체를 저장하고 싶습니다. 개체는 procs를 사용하므로 DB에 저장하는 데 문제가있는 것 같습니다. 누구든지 jruby 오브젝트를 1-5 분 동안 유지하는 좋은 아이디어가 있다면 훌륭합니다.Jruby 영속성 문제

이러한 개체는 매우 크며 특히 Celerity 브라우저 개체입니다. 나는 응용 프로그램을 warbled 한

class Persist 
    @@persistHash ||= Hash.new 

    def self.storeItem(id, item) 
     @@persistHash[id.to_s] = item 
    end 

    def self.getItem(id) 
     return @@persistHash[id.to_s] 
    end 
end 

및 v2를 글래스 피시 그것을 배치 :

지금, 난과 같이 JRuby에서의 모델을 만들었습니다.

프로그램을 실행하면 잠시 동안 제대로 작동합니다. 그러나 하루가 지나면 '매장'(10-20 초) 직후에 'get'이라고 부르면 나는 반환되지 않습니다.

로그에서 오류를 찾을 수 없습니다.

편집 :) (

Persist.storeItem 다음 :

24 전에 시간을 : 나는 또한 항목이 참 (해시 테이블은 삽입시 메모리가 부족하지 않은) 해시 테이블에 삽입되는 것을 발견했다 Persist.getItem()에 의해 잘 작동합니다.

상점 방문 http 전화. get에 대한 또 다른 http 호출은 객체를 반환합니다.

24 시간 후 :

Persist.storeItem() Persist.getItem()이어서 잘 작동한다.

상점 방문 http 전화. get에 대한 또 다른 http 호출은 nil을 리턴합니다.

+0

Persist의 인스턴스가 해당 범위를 벗어날 때 파괴되는 로컬 범위에 있는지 궁금합니다. 그걸 들여다 봤니? –

+0

올바르게 인스턴스화하는 방법을 잘 모르겠습니다. 저장소를 가정하고 정적 클래스 메서드를 가져오고 다른 모델이나 컨트롤러에서 Persist.storeItem을 호출합니다. Persist 클래스가 항상 다시로드되는 경우에도 하루 동안 정상적으로 작동하는 이유를 알 수 없습니다. – Andy

+0

당신 말이 맞아요 - 나는 @@을 눈치 챘지만 클래스 메소드라는 것을 알지 못했습니다. 나의 다음 생각은 항상 너무 재 장전하는 것을 얻고 있었다. 그러나 그것은 하루 동안 OK 일을 감안할 때, 나는 당혹 스럽다. 23:59 및 24:01 시간에 테스트를 마쳤습니까? (예 : 24 시간 표시인지, 아니면 0:00에 재설정 되었습니까?) –

답변

1

언제든지 삭제되는 개체가 표시되지 않습니다.

다른 도구를 사용하여 JVM을 검사 할 것입니다. 메모리를 다 써 버렸지 만 로그 메시지/예외가 메모리 고갈을보고하기 위해 생성되지는 않을 수 있습니다.

다양한 힙 영역에 대한 JMX 모니터링을 연결하고 해시가 기존 객체를 제거 할 수있는 방법을 제안 할 수 있습니다.

위시 나는 당신을 위해 더 가지고 있었다. 행운을 빕니다!

+0

해시 테이블에 올바르게 추가 된 것으로 보입니다. 나는 JMX 모니터를 점검 할 것이다. 누구든지 procs을 가진 큰 jruby 오브젝트를 영속화하는 더 좋은 방법이 있는지 궁금합니다. 멋진 직렬화 보석이 있습니까? – Andy

+0

참으로 메모리 누수가있었습니다. 어느 로그에도 아무 것도 나타나지 않고 세트 이후에도 작동 할 수 있다는 것이 이상했습니다. 나는 스팸 메일을 jmap live : histo | grep 'jruby'그리고 결국 내가 찾던 것을 발견 ^^. – Andy