10 가지 기본 자바 질문 (네 번째 글 머리 기호)

31. 멀티 스레딩이란 무엇이며 어디에 적용 되었습니까?

스레드는 실행 가능한 코드 세그먼트입니다. 스레드는 프로세스를 처리해야합니다. 프로세스에는 여러 스레드가 있습니다. 기본 방법은 기본 스레드입니다. 여러 스레드의 동시 실행은 멀티 스레딩입니다. 스레드 풀은 준비된 스레드를 스레드 풀에 넣는 것입니다. 요청을 처리 할 때 스레드를 호출해야하는 경우 스레드 풀에서 호출 한 다음 다 사용되면 스레드 풀에 다시 넣어서 높은 동시성을 방지하고 리소스를 절약합니다. 현재 개발에 너무 많은 스레드를 포함하지 않습니다. 사실 저는 개인적으로 개인적으로 멀티 스레딩을 사용하는 것은 코드 실행 효율성을 향상시키고 고객 경험을 개선하며 높은 동시성을 해결하기위한 것일 뿐이라는 것을 이해하지만 프로젝트에서 멀티 스레딩을 사용하면 나중에 코드 유지 관리가 쉽지 않습니다. 우리는 이제 이러한 높은 문제를 해결하고 있습니다. 동시성은 미들웨어를 사용하여 해결하고, redis, activeMQ, solr 등을 사용하는 것이 좋습니다. 그런 다음 이러한 미들웨어의 원칙에 대해 이야기합니다 ...이 멀티 스레딩 문제를 영리하게 피할 수 있습니다.

32. 메모리 오버플로 또는 메모리 누수가 발생한 적이 있습니까?

开发的时候遇到过,其实内存溢出指的是jvm内存溢出,通过调整堆,栈的大小来解决。代码中出现死循环或递归调用也会造成内存溢出,一般我们去调整一下他的内存大小就行,配置一下tomcat里的一个参数就能调整,一般造成内存溢出的原因是什么? 一方面有可能是代码中有长时间没有关闭的连接,或者是用IO读取完文件以后没有及时关闭,原来再使用hibernate的时候就遇到过内存溢出,就是因为没有及时的去关闭缓存造成的,还有就是代码问题,比如说写了死循环,程序出问题,递归自己调用自己的时候代码写的有问题都有可能造成内存溢出.我感觉内存泄漏和内存溢出差不多.

33. GC 가비지 콜렉션 프로세스에 대해 이야기하십시오.

我们Java中的垃圾回收都是自动的,我们很少几乎不去手动的干预,我就是先说一下这个JVM中的的堆内存结构,他主要分为新生代和老年代,新生代就是用来存放刚被new出来的对象,一般情况下占堆的1/3空间,还有就是新生代中又分为3个区具体我也记不清是哪三个区了 反正老年代里存放咱们整个应用程序中生命周期长的内存对象,我原来再网上看过,我们的JVM垃圾回收算法我记得差不多有4种,标记清除法,复制算法,标记整理算法,分代收集算法,我就了解其中的两种,比如说 说清楚其中的两个就行,都说出来就有点太假了,根本不可能记不住那么多

첫 번째는 마크 클리어 방법
으로 구분 : 마크, 제거하십시오.
마킹 단계 : 메모리에 쓸모없는 개체를 직접 표시 한 다음, 삭제 단계에서 표시된 개체를 직접 회수합니다.
단점 : 메모리 조각이 형성되고 일부 큰 개체는 충분히 찾을 수 없습니다. 새 가비지 수집 작업을 공간화하고 트리거합니다.
두 번째 유형 : 복사 알고리즘 :
메모리를 같은 크기의 두 조각으로 나눕니다. 한 조각의 메모리가 사용되면 남은 개체를 다른 조각에 복사 한 다음 이전 조각을 정리합니다.
단점 : 너무 많은 메모리 낭비 (노년기의 사용은 비효율적입니다.)
세 번째 유형 : 표식 구성 알고리즘
은 살아남은 모든 개체를 한쪽 끝으로 이동 한 다음이 끝 경계 외부의 메모리를 직접 정리합니다.
네 번째 유형 : 세대 별 수집 알고리즘 : (현재 상용 가상 기계는 이것을 사용)
객체의 중년에 따라 메모리를 여러 블록으로 나눕니다. 일반적으로 Java 힙은 신세대와 구세대로 나뉩니다
. 신세대 : 복사 알고리즘을 사용하여 태그 정렬 알고리즘으로 구세대를 재활용합니다.

34. JVM 메모리 분석, 힙 및 스택 설명, 가상 머신 설명?

Java를 배우면서 JVM 메모리 구조에 힙 메모리, 메소드 영역 및 스택의 세 가지 주요 블록이 있다는 것을 알았습니다. 힙 메모리는 JVM에서 가장 큰 메모리 주소로 주로 젊은 세대, 구세대, 영구 세대로 구성됩니다. 모든 새로운 객체는이 영역에 저장됩니다. 스택은 데이터가 일시적으로 저장되는 곳이며 각 스레드에는 스택이 포함됩니다. 스택은 1 단계 캐시에 저장되며 액세스 속도는 비교적 빠릅니다. 기본 데이터 유형 객체와 사용자 정의 객체에 대한 참조 만 스택에 저장됩니다. 각 스택의 데이터는 비공개이며 다른 스택에서 액세스 할 수 없습니다. 메서드 영역은로드 할 클래스 정보 (예 : 클래스 이름, 수정 자 등), 정적 변수, 생성자, 최종 정의 된 상수, 클래스의 필드 및 메서드 및 기타 정보를 저장합니다.
개체 선언 및 생성
8. 액세스 속성

35. redis 지속성은 몇 가지 방법입니까?

RDB와 AOF의 두 가지 유형이 있습니다. RDB는 스냅 샷 모드로 저장됩니다. 이것은 redis의 기본 지속성 모드이기도합니다. 데이터는 다른 모든 세그먼트에 저장됩니다. 기본값은 15S입니다. 이는 구성 파일을 통해 수정할 수도 있습니다. ,이 저장 방법은 성능이 더 우수하고
또 다른 하나는 AOF가 즉각적인 지속성 방법이라는 것입니다. 데이터가 변경되는 한 하드 디스크에 저장됩니다.이 방법은 데이터 보존 무결성이 높지만 성능이 상대적으로 낮습니다. RDB의 주요 문제는 서버가 다운되었거나 전원이 꺼져 데이터 손실이 발생한다는 것입니다.

36. redis를 사용할 때 캐시 침투 및 캐시 눈사태가 발생 했습니까?

나는 그것을 만났고 침투는 redis가 키에 따라 캐시하고 쿼리하기 때문입니다. 해당 값이 없으면 데이터베이스로 이동하여 찾아야합니다. 키에 해당하는 값이 존재하지 않고 키에 대한 동시 요청 수가 많으면 백엔드 시스템에 많은 부담을줍니다. 이를 캐시 침투라고합니다. 캐시 서버가 다시 시작되거나 일정 시간 내에 많은 수의 캐시가 실패 할 때, 실패하면 백엔드 시스템 (예 : DB)에도 많은 압력을 가하게되며,이를 "캐시 애벌란 치"라고합니다. 해결책은 빈 쿼리 결과를 캐시하고 캐시에 대해 다른 유효 기간을 설정하는 것입니다. 물론 redis 재해 복구를위한 가장 효과적인 방법은 클러스터를 구축하는 것입니다. 캐시가 만료 된 후 데이터베이스를 읽고 캐시를 쓰는 스레드 수는 잠금 또는 대기열에 의해 제어됩니다. 예를 들어, 하나의 스레드 만 데이터를 쿼리하고 특정 키에 대한 캐시를 쓸 수 있으며 다른 스레드는 대기합니다. 캐시 무효화 시간을 가능한 한 균등하게 만들기 위해 다른 키에 대해 다른 만료 시간을 설정합니다.

37. redis 클러스터에 대해 이야기 할 수 있습니까?

Redis는 자체적으로 클러스터 동작 redis_cluster를 지원하고, redis는 마스터-슬레이브 복제도 지원합니다. 이전 구 버전에는 센티넬 모드가있었습니다. 마스터 서버가 다운되면 슬레이브 서버가 자동으로 마스터 서버로 전환 될 수 있습니다. 당사에서 구축 한 redis 클러스터는 루비 스크립트로 구축했습니다. 총 6 개의 서버, 3 개의 마스터, 3 개의 백업을 구축했습니다. 통신 원리는 통신을위한 핑퐁 프로토콜이 있다는 것입니다. 노드의 상태를 판단합니다. 투표 선택 메커니즘으로 판단하면 인터페이스가 다운 된 것으로 판단되는 절반 이상이되면 대기 노드가 시작됩니다. 예, 여기에 데이터를 저장하는 메커니즘을 알려 드리겠습니다. 실제로이 redis는 매번 클러스터를 구축합니다. 각 노드는 해시 슬롯을 저장합니다. 데이터가 저장 될 때마다 redis는 저장된 키 값을 기준으로 해시 값을 계산합니다.이 해시 값을 통해 어떤 해시 슬롯을 마지막에 저장할지 결정하고 가져갈 수 있습니다. 당시에도 마찬가지입니다. 이것이 제가 아는 redis 클러스터입니다.

38. ActiveMQ 메시지 전송 실패 해결 방법 activeMQueue 사용시 문제가 발생 했습니까?

첫 번째는 데이터베이스를 사용하여 문제를 해결하는 것입니다.
협력 방법?이게 보낸 제품의 ID가 아닙니까? 보내기 전에 데이터베이스에 ID를 기록한 다음 상태 필드를 설정하십시오. 0은 메시지가 전송되고 있음을 의미 한 다음 리스너가됩니다. 소비의 경우 소비 성공 후이 필드를 1로 변경하면 몇 번의 비상 사태가 발생합니다. 첫 번째 경우는 갑작스러운 정전이고 내 메시지가 먼저 데이터베이스에 기록되고 그의 상태는 다음과 같습니다. 0이 아닙니다. 그런 다음 Quartz로 작성된 타이머가 있습니다.이 타이머는 데이터베이스로 이동하여 5 분마다 배치를 실행하고 소비가 성공할 때까지 상태가 0 인 데이터로 메시지를 다시 보냅니다.
두 번째 해결 방법은 다음과 같습니다.
메시지를 보낼 때 제출 방법을 설정하고 수동 제출 방법으로 변경하고 백그라운드에서 커밋 상태를 수동으로 변경합니다. 전송이 성공하면 수동 제출 방법을 커밋합니다.

39. ActiveMQ 사용 시나리오

개발 과정에서 ActiveMQ를 사용하여 프로젝트의 결합 정도를 줄이는 데 사용했습니다. 주로 이러한 여러 시나리오에 적용됩니다. 예를 들어 프로젝트가 이제 분산되어 모듈에서 모든 기능을 구현할 수 없습니다. 제품 관리 모듈을 예로 들어 보겠습니다. 제품을 추가, 수정 또는 삭제할 때 다른 모듈도 관련 변경 사항이있을 수 있습니다. 예를 들어 전경 모듈의 검색, 제품 정보가 변경되었으며 인덱스 라이브러리의 컨텐츠도 일치해야합니다. 이때 통신 메커니즘을 사용해야합니다. ActiveMQ 유형의 프레임 워크는 우리가 필요로하는 것입니다. 제품이 작동되면 내 제품 정보가 변경되었다는 메시지를 보낼 수 있습니다. 물론 어떤 것을 지정해야합니다. 제품이 변경되면 해당 제품 ID 만 보내면 프론트 엔드 모듈에서 메시지 수신자를 구성하고 메시지를 받으면 인덱스 라이브러리를 수정할 수 있습니다.
물론, 상품 상세 모듈과 같이 업데이트 인덱스 라이브러리를 동기화하기위한 상품을 추가하는 것 외에도 상품이 승인 된 후 메시지 큐의 상품 ID를 메시지 큐로 보내고 싶습니다. 페이지 서비스 프로젝트에는 해당 정적 페이지를 생성 할 수있는 모니터링 클래스가 있습니다. 이전에 사용했던 주문 모듈도 있는데, 주문 생성, 은행 공제, 성공적인 공제, 재고 감소를 실행할 때 이러한 유형의 작업은 ActiveMQ 메시지를 통해 동기화 될 수 있습니다.

40. 읽기-쓰기 분리 란 무엇입니까?

이 프로젝트에서는 MyCat을 사용하여 메인 라이브러리와 슬레이브 라이브러리를 mycat에 설정하고 추가, 삭제, 수정시 메인 라이브러리를 운영하고 슬레이브 라이브러리에서 쿼리를 수행합니다. 실제로 mysql 자체는 5.6 이상부터입니다. 버전에는 마스터-슬레이브 복제 기능이 있으며 mysql의 로그 파일을 사용하여 데이터를 동기화합니다.

추천

출처blog.csdn.net/zhang_yuanbai/article/details/108701793