개발의변화
1/10 SSAFY 본문
스레드당 하나의 스택
가비지컬렉터가 돌때 스레드를 멈춘다 (Stop The World)
JAVA JVM
Stack: 쓰레드가 프로그램을 실행할 떄 메소드를위한 정보가 저장, (로컬변수,this,.메서드 정보)
메소드를 위한 프레임들이 만들어지고 이 프레임에 로컬변수들이 저장되고 this또한 저장이 되어짐
Heap: 객체를 저장
age값: survivor영역에서 객체의 객체가 살아남은 횟수를 의미하는 값, Object Header기록
기본적으로 사용하는 HotSpot JVM 임계값 31
Survivor영역의 제한 조건 survivor영역 중 반드시 1개는 사용되어야 하고
버전에 따라 매번 달라질 수도 있음
내부적으로 세가지 영역으로 되어짐
Eden(New Generaton): 새롭게 생성하는 객체들이 쌓임 -> 여기서 FULL이 나면 살아있는 것들을 s1,s2로 이동 그리고 지움 (Minor Gc)
Survivor1,Survivor2 (Young Generation): 여기서 FULL이 나면 서로 이동
Old Generation: 이렇게 오래 살아남아 있는 것들만 Old에 놔둠
(Mark Sweep Compact: 죽은 애들을 지우고 old에 컴팩트 시킴
최신버전에서는 g1 gc를 사용함
예전에는 eden,s1,s2,old에서 가비지 컬렉터 선택
지금은 메모리를 블럭화를 활용하여 페러럴로 돌기때문에 성능 개선
)
로컬변수(Stack) - 객체(Heap) 참조
로컬변수 -> 4바이트 (INT) 해시코드가 INT타입이므로 무조건 4바이트
메모리를 직접 찍는 포인터를 사용하지 않음 -> 가비지 컬렉팅을 자동적으로 해줌
메소드를 사용하는 변수를 접근해야 하므로 스택에 먼저 접근
참조할 수 있는 주소 : 레퍼런스,해시코드
객체지향 -> 가비지 컬렉터가 너무 쌓임
for (int i = 0, size = arr.length ; i < size: ; i++
{
}
객체를 직접 접근은 느리다
객체에 자주사용 : 로컬변수로 바꿔서 사용하자
Method Area(Class Area)
class, meata,finance, static,final
meta space => OS 관리
P.C R: JVM의 P.C 레지스트리로 활용
Native Stack : JNI (Native언어로 번역하여 사용가능)
스레드: 스터디
21 -> 멀티코어 Virtual Thread
heap young- old 주기적으로 gc 움직이기에 old까지 차는 일은 없다
G1 GC:
고정된 영역안에서 전체 범위를 컬렉팅 하는 것이 아닌 범위 안에서 메모리 할당에 필요한 영역만을 가비지 컬렉팅을 하여 모든 범위를 탐색하는 다른 GC와는 다르게 빠르게 최적화를 이루어질 수 있음
단점: 힙 영역이 작을수록 별로 좋은 성능을 발휘하지 못 한다는 점 -> Full GC는 오직 위에서 설명한 일반적인 G1 GC 과정으로 메모리 관리가 부족하다고 판단될 때에만 진행된다. 이 경우에는 메모리 효율적이지만 느린 알고리즘을 이용하여 힙 영역 전체를 GC하게 되고 다음 GC에서는 더 좋게 상황을 만들 수 있다. 만약 Full GC가 일어난다면 가능하다면 힙 영역의 크기를 늘리거나 아예 다른 GC를 선택하는 것이 더 좋을 수 있다
Java: 동적이다
객체지향언어 제공 (변화할 수 있다)
동적이지 않으려면 static
1.클래스 로딩 -> 동적
2.메모리할당 -> 동적
3. 메서드 바인딩(binding) ->동적
다이나믹 바인딩,링킹 -> c++ 과 시점이 다르다.
c++ 링킹 -> 컴파일 타임 , 다이나믹 할 때만 (virtual 사용시) 메소드 호출
Java 컴파일 타임시 링킹 X (미리 할 수 없음) , 클래스로드시에 링킹
JVM에 필요한 클래스 로딩 , 소스코드 전체가 올라가지 않음, 실행중인 코드만 올라옴
Static 클래스 로드할 시 링킹을 하므로 오버라이드해봤자 의미가 없음
나머지는 메서드 호출 시 동적으로 binding
-> 그래서 자바는 느리다.
JVM 제공 -> 플랫폼 독립, 멀티 스레딩, 가비지 컬렉팅,
Java: 원시 데이터 타입
boolean, char(16), byte(8),short16,int32,long64,float32,double64
형변환은 메모리크기가 아닌 데이터표현으로 봐야한다
ex) float는 정수,실수 표현 둘 다 가능
float에서 long으로는 형변환이 불가능하다
## 조건문
if else if else -> 비교가 많기에 성능이 느리다
switch -> 조건이 병렬로 연결되어 있어 비교해주는 조건과 상수로 되어있기에 빠르다
단점: 조건과 상수가 같을 때만 즉 >,<,== 로 나타낼 수 없다
java 1.7 -> 기존 int,byte,short,char + 문자열 string
java 14버전 :
##
work-java -> sds
ctrl space -> import할 alert나옴
```java
package chaptor1;
import java.util.Iterator;
import java.util.Scanner;
public class SwitchTest {
public static void main(String [] args) {
Scanner scan = new Scanner(System.in);
System.out.println("score를 입력하세요");
int score = scan.nextInt();
if (score < 0 || score > 100) {
System.out.println("잘못 된 입력입니다. ");
}else {
System.out.println(score + "점은");
switch (score/10) { //정수나누기정수는 자바는 정수나옴
case 9: {
System.out.println("A학점입니다.");
break;
}
case 8: {
System.out.println("B학점입니다.");
break;
}
case 7: {
System.out.println("C학점입니다.");
break;
}
case 6: {
System.out.println("D학점입니다.");
break;
}
default: {
System.out.println("F학점입니다.");
break;
}
}
}
}
```
개선 java 14버전에 추가
switch에 세미콜론 해줘야함
데이터타입 변수명 = switch() {
case 값: yield 값;
}
```java
package chaptor1;
import java.util.Scanner;
public class SwitchTest {
public static void main(String [] args) {
Scanner scan = new Scanner(System.in);
System.out.println("score를 입력하세요");
int score = scan.nextInt();
if (score < 0 || score > 100) {
System.out.println("잘못 된 입력입니다. ");
}else {
System.out.println(score + "점은");
String 학점 = switch (score/10) {
case 9: {
yield "A";
}
case 8: {
yield "B";
}
case 7: {
yield "C";
}
case 6: {
yield "D";
}
default: {
yield "F";
}
};
}
}
}
```
## 반복문
```java
for (int i = 0, size = arr.length; i < size; i++) {
```
heap의 접근을 최소화 하기위해 대체변수에 배열의 길이 할당하여 사용
```java
int [] su = {10,20,30,40};
for (int s: su) {
}
```
범위를 지정 X, 인덱스의 위치를 파악하기 불편
자바 옵티마이징
````java
for (){
label;
for () {
break label;
}
}
```
break위치를 지정할 수 있다.