자바 가상 머신(JVM)은 자바 프로그래밍 실행환경을 만들어주는 소프트웨어이며, OS에 종속받지 않고 CPU가 JAVA를 인식/실행할 수 있게 만드는 가상 컴퓨터라 볼 수 있다.
위의 그림을 보면 일반 프로그램의 경우 OS를 통해 Hardware에 접근하므로 OS에 종속적이다.
JAVA 프로그램의 경우 JVM을 통해 OS에 접근하기 떄문에 OS에 종속적이지 않다.
하지만, JVM을 사용하는 경우 OS에 종속적이지 않다는 특징때문에 속도가 느리다. (종속적인 언어 C에 비해)
또한, JVM을 사용하기 위해선 JDK(JVM : 가상 머신, JRE : 라이브러리 집합소)을 별도로 설치를 해야하는 번거로움이 있는데, 종속적인 언어를 사용할 경우는 운영체제별로 개발해야하는데 이정도 설치쯤이야 별거 아니다!
JVM은 이렇게 OS사이에서 중계자 역할을 하며, JAVA 코드의 재사용성을 높여준다.
Java 소스코드(*.java)는 CPU가 인식을 하지 못하므로 기계어로 컴파일을 해줘야한다.
하지만, Java는 컴파일 후 바로 OS에 가는 것이 아니므로, OS와 Compiler 사이에 있는 JVM이 이해하느 언어(*.class)로 변환해야한다.
Java compiler(JDK를 설치하면 bin에 존재하는 javac,exe ; JDK에 java compiler가 포함되어있음!!!)은 .java 파일을 .class 라는 java bytecode를 변환해주는 역할을 한다.
.class로 변환된 코드는 기계어가 아니기 떄문에 OS가 이해하는 기계어로 변환해주어야 하는데, 이때 JVM이 OS가 이해할 수 있도록 java bytecode를 해석해준다.
-> 이러한 특징으로 JVM은 OS에 종속적이지 않으며 Java 파일 하나만 만들면 어느 디바이스든 JVM위에서 실행할 수 있다는 것!
/*예를 들어 난수로 만들어 암호화한 비밀번호를 반환하는 코드이다.*/
@Transactional
// 비밀번호 난수로 제공
public String findPw(MemberDto memberDto){
//result <= stack 영역에 들어간다(지역변수)
boolean result = memberEntityRepository.existsByMemailAndMphone(memberDto.getMemail(), memberDto.getMphone());
//charStr <= stack 영역에 들어간다(지역변수)
String charStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^";
//newPwd <= stack 영역에 들어간다(지역변수)
String newPwd = "";
if(result){
Optional<MemberEntity> memberEntityOptional = memberEntityRepository.findByMemail(memberDto.getMemail());
if(memberEntityOptional.isPresent()){
MemberEntity entity = memberEntityOptional.get();
for(int i = 0; i < 8; i++){
Random random = new Random();
//ranStr 문자열에서 0인덱스 ~ 마지막 인덱스의 난수 인덱스 만들기
int index = random.nextInt(charStr.length()); //0번 인덱스부터 마지막 인덱스[인덱스를 난수로 가져옴]
newPwd += charStr.charAt(index);
}
entity.setMpassword(passwordEncoder.encode(newPwd));
return newPwd; //return 주소(호출한 주소/곳) stack 영역이다.
}
}
return newPwd; //return 주소(호출한 주소/곳) stack 영역이다.
}
public class AppStart {
//main <= static 메소드로 Method Area에 속한다.
public static void main(String[] args) {
SpringApplication.run(AppStart.class);
}
}
Young Generation 영역은 자바 객체가 생성되자마자 저장되고, 생긴지 얼마 안되는 객체가 저장되는 공간이다.
Heap 영역에 객체가 생성되면 최초로 Eden 영역에 할당된다.
Eden영역에 데이터가 어느정도 쌓이게 되면 참조정도에따라 Servivor의 빈 공간으로 이동되거나 회수된다.
Young Generation(Eden+Servivor) 영역이 차게 되면 또 참조정도에따라 Old 영역으로 이동이 되거나 회수가 된다.
Young Generation과 Tenured Generaction에서의 GC를 Minor GC라고 한다.
Old 영역에 할당된 메모리가 허용치를 넘기게 되면 Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제하는 GC가 실행된다.
이때, Stop-the-world이 발생하며, Old 영역의 메모리를 회수하는 GC를 Major GC라고 한다.