2017-11-26 16 views
2
 public static User32 USER32_INSTANCE = (User32) Native.loadLibrary("user32", User32.class); 

     user32 = USER32_INSTANCE; 

     user32.EnumWindows((hWnd, arg) -> { 
      int size = 1024 * 8; 
      char[] buffer = new char[size]; 
      USER32_INSTANCE.GetWindowTextW(hWnd, buffer, size); 

      char[] buffer2 = new char[size]; 
      PointerByReference pointer = new PointerByReference(); 
      User32DLL.GetWindowThreadProcessId(hWnd, pointer); 
      Pointer process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pointer.getValue()); 
      Psapi.GetModuleBaseNameW(process, null, buffer2, size); 

      String result = Native.toString(buffer).trim(); 
      String proc = Native.toString(buffer2).trim(); 

      // ... (non-JNA stuff) 
     } 

나는 대학 이후 ++ C/C 손도 안 나는 솔직히 실제로 여기에 메모리 :(JNA 메모리 누출 - 수정 방법?

내가 메모리 누수가 있다는 걸 알고 확보하는 방법을 단서가 없다 - 나는 YourKit 몇 가지 프로파일을했고, 추적을 이 코드 블록에 대한 메모리 누수 (특히, GetWindowTextW 호출과 Native.toString() 호출에서 새어 나가고있는 것처럼 보입니다.) 누군가가 사용중인 메모리 블록을 적절히 비우는 방법에 대한 예제를 줄 수 있습니까?

Pointerclear() 메서드를 사용하고 있는데, 사용해야합니까?하지만 크기를 얻는 방법을 모르겠다. (clear 길이 인수). 또한 Pointer 서브 클래스 인 Memory 유형이 있지만, instanceof에 따르면, 현재 가지고있는 포인터 중 실제로 해당 인스턴스가 없습니다.

+0

당신은'저장하는 net.java.dev.jna 플랫폼 패키지 상자에서 윈도우 API의 꽤 심도있는 매핑을 제공하는 것도

Kernel32.INSTANCE.CloseHandle(process); 

주 결과'어딘가에 (해방되지 않도록)? – jdigital

+0

나는 단지 누수와 아무런 관련이 없다는 것을 확신하지만, 표준 프로 시저 일 뿐이므로 문자열을 올바르게 제거 할 수있다. – misaka

+0

최소한의 완전하고 검증 가능한 예제를 만든다면 도움이 될 것이다. . [최소한의 완전하고 검증 가능한 예제를 만드는 방법] (https://stackoverflow.com/help/mcve)을 참조하십시오. – jdigital

답변

2

OpenProcess으로 프로세스 핸들을 연 다음 CloseHandle으로 프로세스 핸들을 닫아야합니다. OpenProcess는 Pointer이 아니라 Handle을 반환한다는 것을 기억하십시오. JNA는 (I 생각?)

+1

감사! 나는 실제로 이것을 잠시 생각했다. 그러나 이것이 내 접근법이 맞다는 것을 확인한다. (단지 jna.platform lol로 바꾼다. :) 나는 처음에는 내장 된 매핑이 있다는 것을 깨닫지 못했다. (당신이 그것을 별도의 병으로 포함해야하기 때문에 메이븐). JNA 레포에있는 예제를 살펴 보았습니다. P 코드를 많이 삭제하고 모든 누수를 해결했습니다! – misaka

+1

이것에 대한 다른 최근의 질문을 발견했기 때문에 다행입니다. 1 + –

+0

@HovercraftFullOfEels 약간의 데자뷰가 있었고 이전에 매우 비슷한 질문에 답한 것을 기억했습니다.) – cubrr