2009-05-05 5 views
0

Eclipse RCP 응용 프로그램에서 많은 편집기를 열려고합니다. 이것은 기본적으로 편집기를 여는 많은 노드가있는 트리입니다. 150-200 명의 편집자를 열어 다음 treenode 편집기를 열려고해도 열리지 않습니다. Eclipse 콘솔에 "org.eclipse.swt.SWTError : No handles handles"이 표시됩니다. 그러나 이미 열려있는 편집자 중 일부를 닫으면 많은 새로운 treenode 편집기를 열 수 있습니다.최대 용량은 얼마입니까? 응용 프로그램에 사용할 수있는 메모리? (더 이상의 핸들 오류를 얻는 것)

javaw.exe의 메모리 사용을 모니터링했습니다. 각 편집기를 열면 메모리가 커지지 만 핸들 수는 특정 MAX 후에도 일정하게 유지됩니다. javaw.exe는 오류가 발생할 때 약 120,000K를 소비합니다. 오류 발생시 모든 응용 프로그램에서 사용하는 총 메모리는 700,000K입니다. IE와 같은 몇 가지 응용 프로그램을 열려고하면 시스템 메모리 부족으로 인해 UI 기능이 열리지 않거나 열리지 않습니다. 2GB RAM을 가지고 있음에도 불구하고이 모든 것!

또한 이클립스 메모리 설정에서 vmargs를 늘려 보았지만 많은 도움이되지 않았습니다.

) 내 코드에 메모리 누수가 있습니까? 핸들이 일정한 MAX 후에 일정하게 유지되는 것처럼 나는 그것을 보지 못합니다. 내가 알기로 에디터가 열려있을 때 SWT 컨트롤은 닫힐 때까지 처리되지 않습니다.

b) 최대 허용치는 무엇입니까? 응용 프로그램에서 사용할 수있는 메모리? 내 RAM이 2GB이고 모든 프로세스에 대한 내 전체 메모리가 약 680MB라고 생각되는 700,000K보다 나은 방법이어야합니다.

답변

1

질문에 특별히 답할 수는 없지만 프로세스가 언제든지 열 수있는 파일의 최대 한도에 도달하고있는 것으로 보입니다 ("핸들"용어로 볼 때 자주 열리는 파일을 많이 언급합니다. 유닉스에서와 같은 파일 기술자). 그러면 운영 체제 수준의 사용자 권한/기능이 문제가됩니다. 허용되는 열린 파일 수는 메모리 크기와 아무 관련이 없습니다.

1

핸들은 파일 핸들 (열린 파일 참조)을 나타내며 운영 체제에 의해 제어됩니다. 많은 파일 핸들을 무제한으로 열어두면 OS 리소스가 많아지기 때문에 일반적으로 사용자가 설정을 변경하지는 않습니다.

이 질문은 If you have to ask, you're probably doing something wrong 범주에 속합니다. ;-)

가장 좋은 방법은 파일을 열고 읽은 다음 닫는 것입니다. 그런 다음 변경 사항을 기록해야 할 때 파일을 다시여십시오. 동시 편집이 걱정되는 경우 잠금 메커니즘을 사용해야 할 수도 있습니다.

너무 많은 로직을 변경하고 싶지 않으면 각 파일을 열어 + 읽고 닫는 데 도움이 될 수 있습니다. 현재 파일에 트리를 삽입 한 다음 다시 열어보십시오 (쓰기 위해). 사용자의 활성보기. 사용자가 탐색 할 때 닫습니다.

2

a) 시도 Sleak. SWT 응용 프로그램에서 GDI 누출을 찾을 수 있습니다.

b) 레지스트리에서 최대 GDI 핸들 또는 사용자 개체를 변경하려고 할 수 있습니다. 자세한 내용은 herehere을 참조하십시오.

표시되는 트리 노드 만 만들 수 있도록 vitual tree을 만들 수도 있습니다.

+0

슬릭 참조 용 +1 - 매우 편리한 도구입니다. – Jared

1

Windows는 여러 종류의 핸들을 처리합니다. (파일, 스레드), GDI 핸들 (글꼴, 브러쉬, 장치 컨텍스트), 사용자 핸들 (창, 메뉴, 대부분의 네이티브 컨트롤, 이미지)을 처리합니다. 이러한 핸들의 대부분에는 시스템 당 사용 가능한 RAM의 양과 아무 관련이없는 프로세스 별 및 전체 시스템 제한이 있습니다. 예 :역사적인 이유로 한 프로세스 당 최대 10000 개의 사용자 핸들과 데스크톱 세션 당 최대 32,000 개의 사용자 핸들이 있습니다. 핸들에 대한 자세한 설명은 http://msdn.microsoft.com/en-us/library/ms810501.aspx을 참조하십시오.

먼저 핸들이 누출되지 않도록해야합니다. 예 : Sleak을 사용합니다. 그런 다음 SWT는 각 위젯에 대해 적어도 하나의 사용자 핸들을 사용한다는 점에 유의해야합니다 (일반 Composite 객체의 경우에도 그렇다). 위젯이 많은 큰 응용 프로그램을 사용하는 경우 사용자 개체 수를 10000 개로 제한합니다. 나는 우리 제품에서이 한계를 극복하기 위해 우리가 한 일에 대해 짧은 블로그 항목을 썼다 : http://www.subshell.com/en/subshell/blog/investigating-user-handles-with-the-swt-detective100.html. 또한 SWT Spy를 도구로 해킹하여 응용 프로그램의 위젯 트리를 조사하고 위젯 개수를 줄이기위한 장소를 찾도록했습니다. 이 도구의 다운로드 링크는 블로그 항목에 있습니다.

관련 문제