2011-10-06 5 views
1

jvm에서 Unsafe 클래스를 사용하여 메모리에 직접 쓰고 읽을 수 있음을 알고 있습니다.Java에서 Unsafe를 사용하여 메모리 쓰기/읽기

정말 안전하지 못하고 어쨌든 비생산적인 점을 제외하고, 나는 허용 된 메모리 위치의 경계를 누가 점검하고 있는지 궁금합니다. 또한 이미 할당 된 메모리를 덮어 쓰게하는 몇 가지 메커니즘이있는 경우. 이 최신 질문과 관련하여, 피해야 할 대상을 덮어 쓰면 어떤 피해가 발생할 수 있습니까? 글쎄, 이것은 가장 좋은 것으로 개혁 될 수 있습니다 : 어떤 종류의 기억이 쓰여질 수 있습니까? 또는 어떤 종류의 정보가 이미 거기에 저장되어 있습니까?

감사

답변

2

기본 운영 체제는 (인해 Virtual Memory에, 쉽게 할 수있는) 응용 프로그램에 할당 된 메모리 밖에 기록하지 않도록합니다. 그렇게하면 세그먼테이션 결함이나 유사한 오류가 발생합니다. JVM은 자체적으로 바운드 검사를 수행 할 수 있습니다. 당신은 확실히 합리적인 (즉, 다른 응용 프로그램) 메모리에 쓸 수 없으며, JVM이 내부 구조를 덮어 쓸 수 있는지 의심 스럽지만 잘못된 것일 수 있습니다. 따라서 질문에 대한 대답을 요약하면 : 응용 프로그램이 오작동하는 가장 좋은 경우가 아니고 최악의 경우 JVM이 충돌하지 않아야하는 곳에 덮어 쓰기가 손상 될 수 있습니다.

세이프 가드와 관련하여 Unsafe를 사용하지 않는 것이 좋습니다. 그 외에도 Unsafe가 할당 한 메모리 내에 자체 메모리 할당자를 작성하고 일부 영역을 플래그 지정하여 애플리케이션 코드가 그것을해서는 안되는 영역에 글쓰기.

마지막 질문에 대한 답은 할당 된 안전하지 않은 영역 밖에서 JVM을 사용하여 메모리에 액세스 할 수있는 경우 액세스 할 수있는 정보 및 유형의 메모리는 내부 JVM 구조. 명백하게 그것들을 바꾸는 것은 혼란을 가져올 것이고, 그렇게하려고하면 충돌을 일으킬 것 같다.

2

Unsafe 클래스를 사용하면 이 허용 된 메모리 위치의 경계를 확인하고 있습니다.

만지지 말아야 할 프로세스 메모리 부분을 손상시키지 못하게하는 메커니즘이 있다고 가정하면 안됩니다. Unsafe.getUnsafe() 함께

comment 아주 분명하다

임의의 메모리 어드레스에 데이터를 읽고 쓰기 위하여 사용될 수 Unsafe 예]가.

+0

그래서 어떤 영역에 쓸 수 있으며 전체 OS를 다운시킬 수 있습니까? – Leonardo

+0

@ 레오나르도 : 아니오, 제 답변대로 프로세스의 메모리 **가 손상 될 수 있습니다. 반은 운영 체제가 다른 프로세스에 영향을 못하게합니다. – NPE

관련 문제