Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

개발의변화

1/10 SSAFY 본문

카테고리 없음

1/10 SSAFY

refindmySapporo 2024. 1. 10. 14:00
반응형

스레드당 하나의 스택

 

가비지컬렉터가 돌때 스레드를 멈춘다 (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위치를 지정할 수 있다.

 

https://jungol.co.kr/problem#1

반응형