2016-11-18 1 views
4

Quote from the Jooq manual : Jooq/자바 상수 풀 64K 제한

클래스의 정수 풀에 허용 된 상수의 양을 초과하는 매우 큰 스키마, 필요할 수 있습니다 위의 파일의 생성을 끄기 (64K) 또는, 그 정적 initialiser 64K 바이트 코드

의 초과 내가 문제를 이해 할 수 있지만, 어떻게 하나의 측정 또는 계획을한다. 누가 얼마나 많은 테이블을 합리적인 평균 이름 길이의 테이블 당 얼마나 많은 열을 가진 좋은 견적을 가지고 있습니까? 나는 그것이 "문자열의 길이가 얼마나 긴지"라는 질문에 대해 정말로 감사하고 있습니다. 그러나 합리적인 정확성 또는 경험있는 견적을 얻을 수있는 공식은 인정됩니다.

답변

7

JOOQ 코드 생성기는 코드 기반의 테이블/시퀀스/키 당 필드를 추가합니다. 코드 생성기는 코드가이 필드 만 설정하고 복잡한 명령문은 생성하지 않으므로 코드 크기를 줄입니다. 필드가 정적이므로 필요한 바이트 코드가 더 줄어 듭니다. 각 초기화 명령은 필드 읽기와 필드 쓰기의 쌍입니다. 바이트 코드에서 각 명령은 다음과 같습니다.

바이트 코드는 각 필드 참조가 2 바이트 색인 인 단일 바이트이며 각 명령은 6 바이트를 계산합니다. 정적 이니셜 라이저는 (암시 적) return 문으로 끝나야하기 때문에 메서드에 다른 바이트가 추가됩니다. 메서드 당 64KB -1 바이트의 사용 가능한 바이트와 필드 당 6 바이트를 사용하면 이니셜 라이저는 한도를 초과하기 전에 클래스 당 최대 10.922 개의 필드를 유지할 수 있습니다 (예 : (65536 - 1)/6 = 10.922 개의 테이블, 시퀀스 또는 키 지원).

constant pool은 최대 65536 개의 항목을 포함 할 수 있습니다. 상수 풀에 중복 값이 ​​포함되어 있지 않지만 기존 항목을 다시 사용하기 때문에 한도 계산이 좀 더 어려워집니다. 이름이 한 번 이상 사용되지 않는 최악의 경우를 계산합니다.

각 필드 참조는 클래스 참조와 이름 및 유형 참조의 합성어입니다. 클래스 참조에는 유형 이름이있는 문자열에 대한 다른 참조가 들어 있습니다. 이름 및 형식 참조에는 필드 이름에 대한 두 개의 참조와 문자열로의 필드 설명자가 들어 있습니다. 설정된 명령어의 소유자 유형은 항상 중복되며 get 명령어는 최악의 경우 중복되지 않으며 명령어 쌍당 2 개의 항목을 차지한다고 가정합니다. set 및 get 필드의 유형과 이름은 각 명령어 쌍마다 항상 동일합니다. 명령어 쌍당 두 개의 항목을 차지합니다. 래핑 이름 및 유형 항목은 항상 양측 모두 고유하며 명령어 쌍당 두 개의 항목을 차지합니다. 이로 인해 명령어 쌍 당 2 + 1 + 1 + 2 = 6 항목이 남습니다. 집합 명령의 소유자 유형은 클래스를 정의하는 데 필요하므로 항상 상수 풀에 있습니다. 또한 정의 된 클래스의 이름과 기본 생성자와 같은 기본 정보를 고려해야합니다. 다행히도 주석에는 클래스 파일에서 제외되는 소스 보존이 있습니다. 일반적인 관리는 1232 개의 항목을 필요로하며 테이블, 시퀀스 또는 키 (65536 - 12)/6 = 10.920을 남겨 둡니다.

두 한계를 모두 준수해야하므로 10.920 테이블, 시퀀스 또는 키은 바인딩 한 번호입니다.

내부 클래스 속성에 대해 상수 풀 항목이 정의되어 있기 때문에 실제 수치가 더 낮을 수 있습니다. 이것은 내부 클래스 당 추가적인 내부 클래스 참조를 생성하여 사용 가능한 항목의 양을 줄입니다. 10.000 이하의 요소를 유지하면 문제가 발생하지 않을 것입니다.

관련 문제