자바 이상 지출 제거

7599 단어 jvm
이상을 던지는 가장 큰 비용은 이상 창고의 구축 과정이다. 만약에 프로그램의 호출이 매우 깊다면 특히 제3자 소스 오픈 프레임워크를 사용하면 이 비용은 무시할 수 없다.
지출은 어디에 있습니까
jdk 원본 보기
  /**
     * Constructs a new throwable with the specified cause and a detail
     * message of {@code (cause==null ? null : cause.toString())} (which
     * typically contains the class and detail message of {@code cause}).
     * This constructor is useful for throwables that are little more than
     * wrappers for other throwables (for example, {@link
     * java.security.PrivilegedActionException}).
     *
     * 

The {@link #fillInStackTrace()} method is called to initialize * the stack trace data in the newly created throwable. * * @param cause the cause (which is saved for later retrieval by the * {@link #getCause()} method). (A {@code null} value is * permitted, and indicates that the cause is nonexistent or * unknown.) * @since 1.4 */

public Throwable(Throwable cause) { fillInStackTrace(); detailMessage = (cause==null ? null : cause.toString()); this.cause = cause; }

주요한 성능 병목은fillInStackTrace에 있는데 이것은native 방법이다.모든 이상 창고를 구축합니다.방법 서명은 다음과 같다.synchronized 수식의 동기화 방법이 있어 성능에 큰 영향을 미친다
/**
     * Fills in the execution stack trace. This method records within this
     * {@code Throwable} object information about the current state of
     * the stack frames for the current thread.
     *
     * 

If the stack trace of this {@code Throwable} {@linkplain * Throwable#Throwable(String, Throwable, boolean, boolean) is not * writable}, calling this method has no effect. * * @return a reference to this {@code Throwable} instance. * @see java.lang.Throwable#printStackTrace() */

public synchronized Throwable fillInStackTrace() { if (stackTrace != null || backtrace != null /* Out of protocol state */ ) { fillInStackTrace(0); stackTrace = UNASSIGNED_STACK; } return this; } private native Throwable fillInStackTrace(int dummy);

어떻게 해결합니까
  • 이상 클래스를 만들 때 fillInStackTrace 방법을 다시 씁니다. java7은 기본적으로 지원됩니다. fillInStackTrace 방법을 실행할 지 여부의 스위치가 추가되었습니다
  • protected Throwable(String message, Throwable cause,
                            boolean enableSuppression,
                            boolean writableStackTrace) {
            if (writableStackTrace) {
                fillInStackTrace();
            } else {
                stackTrace = null;
            }
            detailMessage = message;
            this.cause = cause;
            if (!enableSuppression)
                suppressedExceptions = null;
        }
    
  • 이상을 제거합니다.현재 많은 업무 시스템이 이상으로 프로그램의 정상적인 업무 논리를 실현한다.이것은 성능에 대한 영향이 비교적 큰데, 특히 병발이 비교적 클 때이다.

  • 이상을 찾다
    때때로 당신은 그 이상을 가장 많이 던진 것을 알 수 없다. 어떤 삼자 가방은 자신은throw Exception이지만 자신은catch에 산다.
  • brace 추적 Exception 대 이상 창고, 총계
  • perf top에서 us의 비용을 보십시오. 만약에ZN19java_lang_Throwable19fill_in_stack_traceE6HandleP6Thread 이 순위가 상위권이니 잘 검사해 보세요
  • 토론
    이상으로 정상적인 업무 절차를 실현하는 데는 다음과 같은 장점이 있다
  • 코드가 비교적 정련되어 있다.코드의 가독성을 강화하다.서비스 방법에 대한 통일된 반환치를 설계하지 않아도 된다
  • 절단 기술(차단기 이상 처리기)을 사용하여 이상을 통일된 모니터링과 처리할 수 있다.

  • 단점: 성능 향상:
  • 이상 창고를 구축하지 않고 실패 원인FailCause 또는 오류 코드를 저장합니다
  • fillInStackTrace를 다시 쓰는 방법으로 noop
  • 작성자: RednaxelaFX 링크:https://www.zhihu.com/question/21405047/answer/45055055출처: 저작권은 작가의 소유임을 알 수 있다.상업 전재는 작가에게 연락하여 권한을 부여받고, 비상업 전재는 출처를 밝혀 주십시오.
    사용자 정의 이상 유형이 정말로 Stack trace가 필요하지 않다면, 나는 Fill InStack Trace () 를 덮어써서this로 돌아가는 것을 추천합니다.창고에 기어오르는 것은 투매 비용이 많은 주요 원인 중의 하나다.
    위에서 말한'생각지도 못했던'최적화:'fast throw'에 대해 저는 일상적인 업무에서 오류 로그를 볼 때 자주 보았습니다. 어떤 코드 위치에서 NullPointer Exception이 빈번하게 던져지고 처음에는 이상 창고도 출력하지만 나중에는'throw NullPointer Exception'이라는 말만 출력됩니다. 가-X:-Omit Stack Trace InFast Throw 시작 파라미터를 통해 이 문제를 해결했습니다.
    전재 주소:https://www.jianshu.com/p/4c62967ce1c6

    좋은 웹페이지 즐겨찾기