2012-03-14 5 views
3

저는 Worker 클래스에 선언 된 여러 정적 상수가있는 그룹 프로젝트에서 작업하고 있습니다. 이 작업자의 여러 스레드가 생성되고 Java 응용 프로그램은 엄청난 양의 메모리를 사용하고있는 것으로 보입니다. 이 스레드가 각 정적 상수를 더 할당 한 결과인지 궁금합니다. 그러나 확실하지 않습니다.스레딩 할 때 Java 정적 필드가 여러 번 할당 되었습니까?

+1

아이디어 만 있습니다. 느린 오래된 클래스 인스턴스가있는 최신 배포에는 문제가있을 수 있습니다. 앱 서버를 다시 시작해야합니다. –

+1

@MikeBaranczak 프로그래밍에서 "변수"는 가변적인지 여부에 관계없이 이름이 지정된 수량을 의미하는 경우가 많습니다. cplusplus.com에서 변수는 다음과 같이 정의됩니다. [ "변수를 정의 된 값을 저장하기위한 메모리의 일부로 정의 할 수 있습니다"] (http://www.cplusplus.com/doc/tutorial/variables/) .. 뭔가 다른 것이 있는지에 관해서는 거의 아무것도 말하지 않습니다. 의미 론적으로 말하자면 영어에서는 변수 또는 상수이지만 프로그래밍 용어에서는 "상수 변수"를 말하는 것은 사실 모순이 아닙니다. – Kiril

답변

8

아니요, ClassLoader 당 하나의 정적 변수 인스턴스 만 있습니다.

public class Foo { 
     // only 1 of these 
     private static int bar = 10; 
} 

그러나이 값이 자동으로 동기화된다는 것을 의미하지는 않습니다. 스레드가이 값을 변경하면 synchronized이되어야합니다. 그렇지 않으면 경쟁 조건에 따라 다른 값을 볼 수 있습니다.

+0

이 변수는 최종 변수이므로 걱정하지 않아도됩니다. 나는 이것이 다른 기억 문제를 암시한다고 생각한다. –

+0

@DanQ 그렇게 생각하지 않았지만 그건 후손을위한 것입니다. – Gray

1

정적 변수는 스레드 수에 따라 이 아닌으로 명시 적으로 할당됩니다. 대신 정적 변수는 ClassLoader 내에서 한 번 할당됩니다.

0

"거대한"양의 메모리를 사용하는 경우 많은 GB, 메모리 프로파일 러를 사용하여 원인을 찾아 내고 가능한 경우 수정할 수 있습니다. 몇 백 MB를 사용하고 있다면, 이것이 문제라는 것을 알지 못한다면 걱정할 필요가 없습니다.

관련 문제