1

안녕하세요,이 오류는 코드를 통해 수정할 수 없다는 것을 알고 있습니다. 난 그저 왜, 어떻게 발생했는지 알고 싶다. 또한 JVM이 다른 프로그램의 주소 공간에 액세스하려고 시도했기 때문에 그 사실을 알고있다.왜 EXCEPTION_ACCESS_VIOLATION이 발생하는지에 대한 설명이 필요합니다.

A fatal error has been detected by the Java Runtime Environment: 

    EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6dcd422a, pid=4024, tid=3900 

JRE version: 6.0_14-b08 
Java VM: Java HotSpot(TM) Server VM (14.0-b16 mixed mode windows-x86) 
Problematic frame: 
V [jvm.dll+0x17422a] 

An error report file with more information is saved as: 
C:\PServer\server\bin\hs_err_pid4024.log 

If you would like to submit a bug report, please visit: 
http://java.sun.com/webapps/bugreport/crash.jsp 
+3

이것은 JVM의 버그처럼 보입니다! 버그 보고서를 작성해야합니다. :-) 아마 메모리 손상이나 잘못된 포인터 읽기로 인해 발생했을 것입니다. 다른 프로그램의 메모리를 읽으려는 시도가 아닙니다. – templatetypedef

+0

일반적으로 액세스 위반 배경에 대해 알고 싶습니까? 메모리 분할 등등? 아니면 이것이 버그로 인한 것인지 알고 싶습니까? – yankee

+0

Java 6 업데이트 23을 사용해 보셨습니까? 그 이후로 많은 버그가 수정되었습니다. 이러한 유형의 오류를 유발할 수있는 기본 라이브러리를 사용하고 있습니까? –

답변

1

여기에 온라인으로 볼 수 있습니다 타넨 바움의 책 "현대 운영 체제":

http://lovingod.host.sk/tanenbaum/Unix-Linux-Windows.html

깊이있는 주제를 다룹니다. (4 장은 메모리 관리에 있고 4.8 장은 메모리 분할에 있습니다). 짧은 버전 :

PC의 여러 프로그램이 서로의 메모리에 액세스 할 수 있으면 매우 좋지 않습니다. 사실 하나의 프로그램 내에서도, 하나의 스레드 에서조차 다른 영역에 영향을주지 않아야하는 여러 영역의 메모리가 있습니다. 일반적으로 프로세스에는 "스택"이라고하는 메모리 영역과 "힙"이라고하는 영역이 있습니다 (일반적으로 모든 프로세스는 스레드 당 하나의 힙 + 스택을가집니다. 여기서 설명을위한 문제). 스택과 같은 함수의 인수와 로컬 변수가 저장됩니다. 힙에 변수가 크기이고 수명이 컴파일시에 컴파일러에 의해 결정할 수없는 저장됩니다 (즉, 당신이 - 연산자 "새로운"를 사용하는 Java 모두에있을 것입니다 예 :.이 예에서는

public void bar(String hi, int myInt) 
{ 
    String foo = new String("foobar"); 
} 

은 두 개의 String 객체 : ("foo"와 "hi"에 의해 참조 됨) 두 객체는 ​​모두 힙에 있습니다 (어떤 점에서 두 문자열이 모두 "new"를 사용하여 할당 되었기 때문에 이것을 알 수 있습니다.)이 예제에서는 3 개의 값이 이것은 "myInt", "hi"및 "foo"의 값이 될 것입니다. "hi"와 "foo"는 실제로 문자열을 직접 포함하지 않지만 대신에 그들에게 힙 (String)을 찾을 수있는 힙에 있었다. (java 추상을 많이 사용하기 때문에 설명하기가 쉽지 않다.) C에서 "hi"와 "foo"는 실제로 jus 인 포인터가 될 것이다. t는 실제 값이 저장되는 힙의 주소를 나타내는 정수).

어쨌든 왜 스택과 힙이 있는지 물어볼 수 있습니다. 모든 것을 같은 장소에 두지 마십시오. 불행히도이 답변의 범위를 초과한다는 것을 설명합니다. 나는 연결된 책을 읽는다 ;-). 짧은 버전은 스택과 힙이 다르게 관리되며 분리는 최적화의 이유로 수행됩니다.

스택 및 힙의 크기는 제한되어 있습니다. (Linux에서는 ulimit -a을 실행하면 "데이터 분할 크기"(힙)와 "스택 크기"(예 ... 스택 :-))을 포함한 목록이 표시됩니다.).

스택은 그냥 커지는 것입니다. 점점 더 많은 데이터를 추가하면 배열이 커지면 커집니다. 결국 공간이 부족합니다. 이 경우 더 이상 당신에게 속하지 않는 메모리 영역에 글을 쓸 수 있습니다. 그리고 그것은 매우 나쁠 것입니다. 따라서 운영 체제는 프로그램이 발생하면 프로그램에이를 알리고 중지합니다. Linux에서는 "Segmenation fault"가 발생하고 Windows에서는 "Access violation"이 발생합니다.

C와 같은 다른 언어에서는 수동으로 메모리를 관리해야합니다. 작은 오류로 인해 쉽게 자신의 것이 아닌 일부 공간에 우발적으로 쓸 수 있습니다. Java에서는 "자동 메모리 관리"기능이 있습니다. 즉, JVM이 모든 것을 자동으로 처리합니다. 당신은 걱정할 필요가 없으며 개발자로서 어깨에서 짐을 짊어 져야합니다 (일반적으로 그렇게합니다.) "부하"부분에 동의하지 않는 사람들이 있다고 생각합니다 .-)). 즉, Java로 세그먼테이션 결함을 생성하는 것은 불가능합니다. 불행히도 JVM은 완벽하지 않습니다. 때로는 버그와 나사가 있습니다. 그리고 당신은 당신이 가진 것을 얻습니다.

+0

안녕하세요 yankee 전 꽤 오래 전 전체 책을 읽었습니다.) – Divyesh

+0

JVM – Divyesh

+0

가비지 컬렉터에서 버그가 존재할 수있는 위치에 대한 정보가 필요했지만 어쨌든 긴 설명을 주셔서 감사합니다. P :) – Divyesh

관련 문제