묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
cpu 코어와 쓰레드 개수
설명에서 멀티코어 CPU 가 8개 있으면 한번에 16개 쓰레드를 실행할 수 있다고 말씀하시면서 설명을 진행해주셨는데요. 이전부터 궁금한게 있습니다. (제가 경험한 바로) 실무에서는 하나의 서버에 하나의 어플리케이션 (ex. 자바 웹 어플리케이션) 만 올려왔습니다. 이런 경우에는 위에서 말씀하신것처럼 웹 애플리케이션의 쓰레드들이 모든 cpu core 를 사용하게 될거라고 예상이 됩니다. 반면에 저희가 평소에 사용하는 환경 (ex. 윈도우) 에서는 하나의 유저 어플리케이션만 돌아가는게 아니라, 여러개의 유저 어플리케이션이 돌아갈텐데요. 예를 들어, intellij, chrome, 실습중인 자바 웹어플리케이션 등이 동시에 돌아가게 되면 각각의 유저 어플리케이션 내부에 존재하는 쓰레드들이 cpu 코어를 나눠쓰게 된다고 알고 있습니다. 이런 경우에는, 강좌에서 설명하신것처럼 cpu core 8개를 기준으로 최적화를 해도 사실상 제대로 최적화가 안될거 같은데 맞을까요 (= 다른 어플리케이션이 같이 돌아가니)? 그리고, cpu 코어를 사용하는 순서 (스케줄링) 는 os 에 의해서 정해지는걸로 알고 있는데요. 예를 들어, intellij (쓰레드 3개), chrome (쓰레드 5개), 웹서버 (쓰레드 50개) 라고 가정했을때 쓰레드가 많은 유저 어플리케이션이 cpu 의 사용횟수가 많을거라고 생각해도 될까요? 아니면, os 에서 유저 어플리케이션 3개에 공평하게 30% 씩 사용시간을 분배하고 이 30%의 시간을 내부에 있는 쓰레드들이 나눠쓰게 되는걸까요? 강사님 설명이 너무 좋아서 여러 방면에서 생각하다보니 질문이 많아졌습니다. 답변 미리 감사합니다 🙂
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
JVM 메모리와 CPU 1,2차 캐시
어떤 강사님께서는 volatile 을 설명하실때 'JVM 의 메인메모리 와 작업메모리' 로 설명해주시지 않고 CPU 와 1, 2차 캐시 사이에 동기화를 하는데 쓰여진다고 설명을 하셨는데요. 널널한 개발자님께서 설명한 부분이 더 정확하다고 생각이 듭니다. 제가 궁금한건 말씀하신 내용처럼 JVM '메인메모리' 와 '작업 메모리' 사이에서 동기화가 필요할때 여러 문법들을 사용한다면, java 를 사용할때 CPU 와 1,2 차 캐시 사이의 동기화에 대해서는 신경쓸 필요 없다고 이해해도 될까요? 이 부분을 JVM 이 알아서 처리한다고 이해하는게 맞을까요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
해시 알고리즘 관련으로 질문이 있습니다.
안녕하세요.현재 cs 강의부터 c/c++/시스템.네트워크,tcp/ip 등 백엔드에 도움되는 강의를 듣고 현재 자바강의를 듣고 있습니다. 자료구조와 알고리즘을 공부할 때 저의 공부방법이 왜 사용하는지, 어떨 때 사용할지, 어떻게 작성하는지, 이럴 때엔 어떻게 대응 할 지를 중심으로 공부를 하고 있습니다. 배열, 스택, 큐, 연결리스트는 코드를 보지 않고 작성할 수 있도록 미리 훈련을 해놓았었지만 최근에 트리 / 해시로 넘어가면서부터 '이걸 안 보고 쓸 정도로 외우려면 시간 소요가 심할 것 같은데?' 생각이 들었습니다. 이러한 고민을 하게 된 건 전에 경쟁력 있는 백엔드 개발자가 되려면 홈페이지 하나는 코드를 보지 않고 써야한다 라는 얘기를 들었기 때문입니다.(다만 공부하고 있는 학생으로 홈페이지 만드는 코드가 무엇인지를 모르기에 이러한 고민을 하게 되는 것도 있습니다.) 13년 전에 C/C++ 개발 회사에서 일을 했을 때 코드를 외우는 게 아니라 어떠한 코드가 필요할 때 책을 펼쳐서 보고 직접 타이핑을 쳤었는데, 안 보고 쓸 정도로 외우기가 어려운 알고리즘들도 마찬가지 아닐까 하는 의구심이 들어 질문 드려봅니다. (현재는 바이브 코딩이겠지만요)
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
21분 경 Old generation의 GC 설명 질문입니다.
21분 경에 Old Generation을 설명하시면서 Full GC를 언급하셨는데, 해당 시점에는 Major GC가 발생해서 개체를 회수하게 되고 Major GC로 부터 살아남은 개체가 Metaspace 영역으로 옮겨지는 것 아닌가요?? 물론 Full GC를 통해서도 Old Generation의 개체가 회수되기는 하겠지만 해당 부분 설명에선 Major GC로 언급하는 것이 그림과 일치하지 않나해서 질문드립니다
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
임시 객체의 첫 번째 상황에 대한 질문
강의에서 임시 객체가 생성되는 첫 번째 상황으로 클래스가 함수의 반환 자료형이 될 경우 (이름이 없는) 임시 객체를 생성을 언급해주셨습니다. 이 경우가 아래와 같은 상황을 말하는걸까요?Class get() { return new Class(); } 그렇다면, 해당 함수(메서드)로 받은 인스턴스에 대한 참조자가 생긴다면, 그 때는 임시 객체가 아니게 되는건가요?Class value = get();
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
36강 SpinLock 부분 질문
public void lock() { while (!owner.compareAndSet(false, true)) LockSupport.parkNanos(1); }강의에서 직접 구현하신 스핀락에서 LockSupport.parkNanos()를 사용하셨을 때, 컨텍스트 스위칭이 발생하지 않는다고 설명해주셨는데요.실제로 예제 코드에서 Thread.getState()로 스레드 상태를 확인해보니, parkNanos() 호출 시 스레드가 TIMED_WAITING 상태로 전환되었다가 지정한 시간이 지나면 RUNNABLE 상태로 바뀌는 것을 확인했습니다.그렇다면 지정한 시간이 지난 후 RUNNABLE 상태가 되었을 때, 해당 스레드에 대해 컨텍스트 스위칭이 발생하는 것이 아닌지 궁금합니다.또한 강의에서는 parkNanos()가 실제로 블로킹되는 것이 아니라 내부적으로 스피닝한다고 설명해주셨는데, 만약 그렇다면 스레드 상태가 RUNNABLE이어야 하지 않을까 하는 의문도 들었습니다.이 부분이 조금 혼란스러워 이렇게 질문드리게 되었습니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
String 객체가 하나 더 생성되는 이유가 궁금합니다
강사님 안녕하세요."[실습] MyString 클래스 생성자 다중 정의" 강의 6:21 설명에서 생성자에서 this.setString(param)을 실행할 경우, String 객체가 하나 더 생성된다 하셨습니다.저는 여기서 param이 객체 참조를 넘겨주어서 따로 객체가 생성되지 않을 것이라 생각했는데 혹시 어떤 이유로 생성되는지 궁금합니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
44강, 45강을 듣고 궁금한 점이 있어 질문드립니다.
안녕하세요:)강의를 듣고 궁금한 점이 있어 질문드립니다. 44강과 45강에서 List에 대해 설명해 주시면서 일반적인 상황에서는 ArrayList나 LinkedList를, 동시성 문제가 고려되어야 하는 상황에서는 Vector를 사용하라고 말씀해 주셨습니다. 그런데 Vector는 JDK 1.x 시절에 도입된 레거시 클래스로 모든 public 메서드에 synchronized 키워드가 적용되어 있어 성능 저하와 불필요한 락 경쟁, 캐시 무효화 등의 문제가 발생할 수 있는 것으로 알고 있습니다. 그래서 현재는 java.util.concurrent 패키지에서 제공하는 동시성 컬렉션이나, Collections.synchronizedList, CopyOnWriteArrayList와 같은 대안들을 상황에 맞게 사용하는 것이 더 적절하다고 알고 있습니다. 이러한 이유로 단순히 동시성 문제를 고려해야 하는 상황에서 Vector를 권장한다라는 접근은 현재 시점에서 어울리지 않는다고 생각됩니다. 그럼에도 강의에서 Vector를 언급하신 특별한 의도나 배경이 있으셨는지 궁금하여 질문드립니다 :)
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
하위 클래스와 상위 클래스의 생성자 순서
섹션 4. 상속과 관계 - 22. 상속과 생성자 10:45 설명이 막연하여 남깁니다.MyTestEx 클래스의 생성자에는 상위 클래스의 생성자를 호출하는 super()가 생략되어 있습니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
커널객체와 jvm 객체 차이 질문.
제가 cs가 조금 약해서 그런데...커널객체랑 jvm내 객체랑..크게 보면 같은 의미라고 할수있나요? 자바에서 객체는 JVM이 관리하는 메모리 내 인스턴스--> 인데... 커널 객체도... 만약에 C로 짜여진 운영체제라면..네이티브 메모리에 올라가있는 데이터구조 인스턴스..?라고 해야하나 그런걸 의미하는걸까요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
GC의 age와 관련하여 질문 있습니다.
안녕하세요!JVM 파트를 복습하다가 궁금한 점이 생겨 질문드립니다. Young Generation(Eden → S0 ↔ S1) → Old Generation → Permanent 영역으로 객체가 이동하는 과정에서 객체의 age가 세대 간 이동(Eden → S0 ↔ S1 포함)을 거치며 증가한다고 설명해주셨습니다. 그런데 제가 알고 있기로 age는 Young Generation 내의 Survivor 영역(S0 ↔ S1)을 이동할 때에만 증가하는 것으로 알고 있습니다.age는 객체가 Minor GC를 거쳐 살아남은 횟수로 일반적으로 약 15회 생존하면 Old Generation으로 승격될 수 있는 조건이 되고, Old Generation으로 승격된 이후에는 더 이상 age가 증가하지 않는다고 알고 있습니다. 혹시 이 동작 방식이 JVM 구현체에 따라 달라질 수 있는 부분인지 아니면 제가 알고 있는 age는 다른 age인 것인지 궁금해서 질문드립니다:)
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
Object Header 의 Klass word (39강 36:00)
39강의 36분 경에 보여주시는 그림에 보면 Object Header 의 Klass word 가 Metaspace 영역의 Class 클래스의 메타데이터를 가르키고 있습니다. 해당 Class 클래스의 메타데이터 내용을 보면 Object Age 나 Lock Flag 등이 들어가는데 제가 공부하기로는 Object Age 나 Lock Flag 와 같은 개별 인스턴스가 가져야 하는 메타데이터는 Mark Word 에 저장되는 것으로 알고 있었는데, 아닌가요?그렇다면 이 강의에서 설명하신 바로는 Class 클래스가 클래스로더의 "준비" 단계에서 생성되고, 실제 인스턴스 객체는 나중에 생성된다고 하셨는데 "준비"단계에 생성된 Class 클래스에 인스턴스 별로 다르게 가져야 하는 정보 (age, lock flag 등) 이 어떻게 구별되서 저장되나요?
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
JVM 스레드 TLS 질문
선생님께서 말씀하시는 TLS는 프로세스의 한정적인 VMS위에서 나뉘어서 사용되는건가요?? Heap area에 비해 다른 영역은 작은걸로 아는데 TLS가 나뉘어서 사용되면 영역이 작아지지 않을까라고 생각되서 질문드립니다!!
-
해결됨기초 탄탄! 독하게 시작하는 Java Part 3(상) : 멀티스레드와 동기화
몇가지 질문드립니다
lock flag로 스레드가 인스턴스에 접근한다고 하셨습니다. 그런데 멀티스레드에서는 동시에 인스턴스에 접근하여 각각 코어에서 연산을 하기 때문에 동기화 문제가 발생합니다. 그럼 항상 lock flag을 획득하고 접근하는게 아닌가요? 그리고 스레드가 함수 단위라 하셨는데, write 과정을 cpu 스케줄링 관점에서 생각하면Time slice 내에서 load, read 하고 기다린 뒤 다시 자신의 차례가 왔을 때 memory에 write한다고 이해했는데 맞나요? 또한 synchronized를 이용하면 원자성이 보장된다고 하셨습니다. 그렇다면 복잡한 로직과 관계 없이 synchronized를 붙이면 스케줄링 없이 한방에 실행되는 건가요? 마지막으로.. 서버를 겉햝기식으로 공부하다가 회의감이 들어 널널한 개발자님 강의를 들으며 jvm, 자바부터 다시 공부하고 있습니다. 하지만 공부를 하면서 불안하고 회의감이 듭니다. 왜 이런 감정이 드나 생각해보았더니 jvm, 멀티스레드를 프로젝트에 어떻게 녹여서 포트폴리오화 해야 할지 모르는 막막함 때문이었습니다. 제 생각에 조언, 지적을 해주실 수 있나요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
method area는 이름이 class area가 아니고 왜 method aread인지 궁금합니다.
제 궁금증은 method area는 이름이 class area가 아니고 왜 method aread인가? 입니다.JVM specification저자 중 한명에게 이메일 보내봤는데I'm afraid I don't know the answer to your question. My involvement with Java ended in October 2006, and I have never looked back. I think these terms (Method Area, Class Area) were introduced after my time working on Java. 라는 답변을 받긴 했습니다.그래서 열심히 ai와 물어봤는데 자바에서 프로그램 실행은 메서드 호출을 통해서 이루어지기 때문이라고 추측하더라구요.저는 막연히 자바는 객체지향 언어니까 class가 중심이지라고 생각했는데..또 "실행" 관점에서 보면 진짜 method가 중심이겠더라구요.객체인스턴스 초기화도 결국 init()메서드인거구요.음.. 어떻게 생각하시는지? 궁금합니다!
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
교안 p.305 'throw 필수' 질문
교안 305쪽에 두 가지 예외 종류Checked예외처리 강제화catch 혹은 throw 필수라고 되어있는데 'throw'가 아니라 'throws'필수인 것 같아 글 남깁니다:)
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
Metaspace에 대한 질문
안녕하세요 널널한개발자님 수업들으면서 많은 것을 배우고 있습니다! 다름이 아니고 Method Area 수업에서는 Method Area가 Java 8부터는 PermGen에서 Metaspace에 속하게 되고, JVM Heap 영역이 아니라 Native Memory에서 관리한다고 배웠는데 JVM Heap 영역 수업에서 영구 세대(Metaspace)가 같은 것을 지칭하는 것일까요? 제가 보기에는 같은 것을 지칭하는 것 같다고 생각합니다. 그러면 Meataspace는 더 이상 Heap 영역에서 관리하지 않기 때문에 GC로 제거가 되지 않는 것이 맞을까요? 또한 저는 처음에 PermanentGen = Method Area라고 생각했는데 그게 아니라 Permanent 영역이 Method Area 영역을 포괄하는 큰 영역이기 때문에Java 8 이전: PermentGen에 포함된 MethodArea까지 GC가 관리(full시)Java 8 이후: MethodArea가 PermGen인 Heap 영역에서 분리되었으니 더이상 GC 관리 X 다만 다른 PermGen 영역만 full gc때 관리라고 생각하면 될까요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
clone() 메서드를 재정의함으로써 Deep copy로 구현한다로 이해하면 될까요?
안녕하세요!한가지 아리송한 부분이 있어 질문 드립니다:)20:30 정도에 clone()이 등장하는데 clone()을 그냥 사용하는 것이 아니라 '재정의 하여 사용함으로써 Deep copy가 된다'는 의미로 이해하면 될까요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
MyListEx 질문드립니다.
MyListEx 생성자에서 UserData를 매개변수로 받도록 설계한 이유에 대해 궁금합니다.MyNode라는 추상 자료형(ADT)을 정의해 두셨는데, 생성자에서 특정 구현체인 UserData를 직접 받는 방식이 추상화의 장점을 제한할 수 있다고 생각합니다.또한, onRemoveNode 메서드에서도 UserData 타입으로 변환하지 않고 MyNode에 정의된 메서드만으로도 충분히 기능 구현이 가능해 보이는데, 혹시 MyListEx는 UserData를 위한 전용 자료구조로 설계된 것인가요?그렇지 않다면, MyNode를 기반으로 유연성을 유지하도록 설계하는 것이 더 적합하지 않을까 하는 생각이 들어 질문드립니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
part3 강의 개강
제 기억에는 작년 말에는 part3강의가 나온다고 하셨는데,언제 쯤 강의 오픈 예정이신가요?