Java에서 메모리를 언급할 때 많은 사람들은 JVM을 떠올릴 것이다. 이 글에서 논의하는 메모리 모델 역시 이와 같이 오해될 것이다. 사실 이 부분도 면접에서 실수할 가능성이 더 높은 테스트 포인트이기도 합니다. 기억모형의 약자는 jmm이라고 해서 영어 이름으로 표시하면 쉽게 헷갈리지 않을 거라 믿습니다. 아래에서는 Java 메모리 모델의 개념을 설명하고 이를 jvm과 구별하는 데 도움을 줍니다.
1. 컨셉
Java 메모리 모델(Java Main Memory, 줄여서 JMM)은 추상적인 개념이며 컴퓨터 메모리 모델과 많은 유사점을 가지고 있습니다. JMM은 주로 스레드, 작업 메모리 및 상호 작용하는 기본 메모리를 포함합니다. 작업 메모리는 계산 캐시와 비교할 수 있지만 스레드 간의 작업 메모리는 서로 독립적입니다. 컴퓨터의 기본 메모리와 유사합니다. , 스레드 간의 변수 값 전송은 주로 메인 메모리를 통해 수행됩니다. 동시에 JMM에는 코드 실행 순서를 최적화하기 위한 명령 재정렬 기능도 있습니다. 간단히 말해서, 코드가 작성된 순서가 반드시 코드가 실행되는 순서는 아닙니다.
2. JMM과 JVM의 차이점
자바 메모리 모델은 자바 메모리 구조(JVM 메모리 구조)와 비슷해 보이지만 둘이 같은 것이라고 착각하는 사람이 많아 면접 과정에서 오답이 나오는 경우가 많다.
Java 힙 및 메소드 영역은 여러 스레드가 공유하는 데이터 영역입니다. 즉, 여러 스레드가 힙 또는 메서드 영역에 저장된 동일한 데이터에 대해 작업을 수행할 수 있습니다. 이것이 우리가 흔히 "Java 스레드가 공유 메모리를 통해 통신한다"라고 부르는 것입니다.
Java 메모리 모델은 영어 JMM(Java Memory Model)을 번역한 것입니다. 실제로 JMM은 JVM 메모리 구조만큼 실제적으로 존재하지 않습니다. 그것은 단지 추상적인 개념일 뿐이다. JSR-133: Java 메모리 모델 및 스레드 사양은 JMM이 멀티스레딩과 관련되어 있음을 설명합니다. 이 사양은 한 스레드가 공유 변수에 쓸 때 다른 스레드에서 볼 수 있음을 정의합니다. .
그래서 간단히 정리하자면, Java의 멀티스레드는 공유 메모리를 통해 통신하는데, 공유 메모리를 통신에 사용하기 때문에 통신 과정에서 가시성, 원자성, 순서 등 일련의 문제가 발생하게 되며, JMM 멀티스레드 통신과 이와 관련된 일련의 기능을 기반으로 구축된 모델입니다. JMM은 Java 언어에서 휘발성 및 동기화와 같은 키워드에 매핑되는 일부 구문 세트를 정의합니다.
위는 Java의 메모리 모델에 대한 소개입니다. 이 기사에서는 기본 이론을 공유하는 데 중점을 두었습니다. jmm과 jvm을 구별하는 데 중점을 둘 수 있으며, 앞으로 공부할 때 이 두 개념에 대해 더 명확하게 알 수 있습니다 .