묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨기초 탄탄! 독하게 시작하는 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강의가 나온다고 하셨는데,언제 쯤 강의 오픈 예정이신가요?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
문자열 비교 강좌에서 문자열 선언 방법 간에 hashCode() 값 관련한 질문입니다.
해당 강좌에서 String str1 = "java"로 선언한 객체와 String str2 = new String("java")로 선언한 객체는,다른 메모리 공간에 저장된다고 말씀하셨는데요.hashCode()로 확인한 결과 동일한 값이 출력되어 문의드립니다.String str1 = "java"; String str2 = "java"; String str3 = new String("java"); String str4 = new String("java");위 코드처럼 선언한 후 hashCode()로 출력하면 str1 ~ str4까지 동일한 값이 출력됩니다.System.out.println("str1 : str2 -> " + str1.hashCode() + " : " + str2.hashCode()); System.out.println("str3 : str4 -> " + str3.hashCode() + " : " + str4.hashCode()); 헌데 동일성 확인을 하면 str1과 str2 는 true 이고,str3과 str4는 false가 출력되고요.물론 str1과 str3도 false가 출력됩니다.이걸 어떻게 해석해야 하는지 문의 드립니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
상속과 오지랖의 콜라보 예제에서 clone() 메서드에 대한 문의드립니다.
해당 예제(22:17)의 setString(String param)에서string 필드 변수의 값을 수정하고자 아래 구문을 사용하셨는데요,string = param.getBytes().clone(); clone() 메서드를 사용하지 않아도(아래 구문) string 필드 변수의 수정이 가능한데, clone() 메서드를 사용한 이유를 알 수 있을까요?string = param.getBytes(); 해당 의문에 대해서 얇은/깊은 복사와 관련이 있는지 확인해보기 위해 디버깅을 해본 결과,두 변수는 값은 같으나, 다른 메모리 위치를 갖는 것으로 확인을 했습니다.-> clone() 메서드가 있는 코드/없는 코드 모두 위와 동일하게 동작하는 것을 확인했습니다.그래서 다른 이유로 clone() 메서드를 사용하신 거 같은데, 어떤 이유인지 문의 드립니다.
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
보이지 않는 임시 객체의 자막 수정 요청
수업 내용을 스크립트로 볼 수 있어서 매우 큰 도움을 받고 있습니다.듣는 도중 자잘한 오타는 건의를 하는 편인데, 이번 건은 3줄이 모두 이상한 말로 등록되어 있어서 인프런측에 제보합니다.7:33, 7:36, 7:42 의 자막이 강사님 말과는 전혀 다른 엉뚱한 자막이 삽입되어 있습니다.확인 후 수정 요청합니다.