programing

왜 sun.misc는?안전하지 않은 것이 존재하며, 현실에서 어떻게 사용될 수 있을까요?

itsource 2022. 7. 26. 23:22
반응형

왜 sun.misc는?안전하지 않은 것이 존재하며, 현실에서 어떻게 사용될 수 있을까요?

우연히 태양과 마주쳤죠요전날 안전하지 않은 패키지로 인해 그것이 할 수 있는 일에 놀랐습니다.

물론, 그 수업은 문서화되어 있지 않지만, 나는 그것을 사용할 좋은 이유가 있는지 궁금했다.어떤 시나리오가 발생할 수 있습니까?실제 시나리오에서는 어떻게 사용할 수 있을까요?

또한, 만약 그것이 필요하다면, 당신의 디자인에 뭔가 문제가 있는 것은 아닐까요?

왜 Java는 이 클래스를 포함합니까?

  1. VM의 「인트라이네이션」. 즉, 록 프리 해시 테이블에서 사용되는 CAS(Compare-And-Swap)는, 실제의 JNI 콜을, CAS에 관한 특수한 순서를 포함한 네이티브 코드로 발신할 수 있습니다.

    CAS에 대한 자세한 내용은http://http://en.wikipedia.org/wiki/Compare-and-swap 를 참조해 주세요.

  2. 태양.misc.호스트 VM의 안전하지 않은 기능을 사용하여 초기화되지 않은 개체를 할당한 다음 생성자 호출을 다른 메서드 호출과 동일하게 해석할 수 있습니다.

  3. 네이티브 주소에서 데이터를 추적할 수 있습니다.java.lang을 사용하여 오브젝트의 메모리주소를 취득할 수 있습니다.안전하지 않은 클래스 및 안전하지 않은 get/put 메서드를 통해 해당 필드에서 직접 작동!

  4. JVM에 대한 컴파일 시간 최적화"매직"을 사용하여 낮은 수준의 작업이 필요한 고성능 VM.예: http://en.wikipedia.org/wiki/Jikes_RVM

  5. 메모리 할당(sun.misc).Unsecure.allocate Memory 예:- DirectByteBuffer.allocateDirect가 호출되면 DirectByteBuffer 컨스트럭터가 내부적으로 호출합니다.

  6. 콜 스택을 추적하고 sun.misc에 의해 인스턴스화된 값을 사용하여 재생합니다.안전하지 않고 계측에 유용합니다.

  7. sun.misc.Unsecure.arrayBaseOffset 및 arrayIndexScale을 사용하여 어레이렛을 개발할 수 있습니다.이 기술은 대규모 어레이를 보다 작은 오브젝트로 효율적으로 분할하여 큰 오브젝트의 스캔, 갱신 또는 이동에 필요한 실시간 비용을 제한합니다.

  8. http://robaustin.wikidot.com/how-to-write-to-direct-memory-locations-in-java

자세한 내용은 이쪽 - http://bytescrolls.blogspot.com/2011/04/interesting-uses-of-sunmiscunsafe.html

일부 코드 검색 엔진에서 검색을 실행하는 것만으로 다음과 같은 예를 볼 수 있습니다.

  • Java 객체 표기법 - javadoc을 인용하여 보다 효율적인 어레이 처리에 사용합니다.

{@link Unsecure} 개체에 대한 액세스 권한을 얻기 위한 단순 클래스입니다.어레이에서 효율적인 CAS 작업을 수행하려면 {@link Unsecure} *가 필요합니다.{@link java.util.concurrent.atomic}의 버전은 {@link java.util.concurrent.atomic}과 같습니다.AtomicLongArray}에는 일반적으로 이러한 알고리즘에는 필요하지 않으며 대부분의 프로세서에서 비용이 많이 드는 추가 메모리 순서 보증이 필요합니다.

  • SoyLatte - osx javadoc용 Java 6 발췌

/** sun.misc의 베이스 클래스.스태틱 필드의 안전하지 않은 기반 FieldAccessors.반사 코드의 관점에서 볼 때 필드는 8가지 원시 유형과 객체 등 9가지 유형밖에 없다는 것이 관측이다.생성된 바이트 코드 대신 안전하지 않은 클래스를 사용하면 동적으로 생성된 FieldAccessor의 메모리와 로드 시간이 절약됩니다.*/

  • 스파이크 소스

/* 유선 경유로 송신되는 Final Fields ..수신측에서 오브젝트의 마크를 해제하고 재작성하는 방법생성자가 최종 필드의 값을 설정하기 때문에 생성자를 호출하지 않습니다.송신측과 똑같이 최종 필드를 재현해야 합니다.태양.misc.안전하지 않다는 건 우리에게도 마찬가지입니다.*/

그 밖에도 많은 예가 있습니다.위의 링크를 따라가면 됩니다.

재미있네요, 저는 이 수업에 대해 들어본 적도 없어요(그건 아마 좋은 일일 거예요

우선 Unsecure #set Memory를 사용하여 중요한 정보(패스워드, 키 등)를 포함한 버퍼를 제로화하는 것이 생각납니다."불변의" 객체의 필드에도 이 작업을 수행할 수 있습니다(그렇지만, 여기서도 오래된 반사가 도움이 될 수 있습니다).하지만 나는 보안 전문가가 아니니 참고 들어라.

.6의 극히 1.6.12의 모든 이 있는 것 .Unsafe이치노

CAS 동작은 Atomic* 클래스를 통해 공개됩니다.메모리 조작 기능은 DirectByteBuffer Sync 명령(park, unpark)을 통해 노출되며 AbstractQueuedSynchronizer를 통해 노출되며, 이는 Lock 구현에서 사용됩니다.

Unsecure.throwException - 선택한 예외를 선언하지 않고 슬로우할 수 있습니다.

이것은 반사 또는 AOP를 처리하는 경우에 유용합니다.

사용자 정의 인터페이스의 범용 프록시를 빌드한다고 가정합니다.또한 사용자는 인터페이스에서 예외를 선언하는 것만으로 특별한 경우 삽입에 의해 어떤 예외가 발생하는지 지정할 수 있습니다.이것이 인터페이스의 동적 구현에서 체크된 예외를 발생시키는 유일한 방법입니다.

import org.junit.Test;
/** need to allow forbidden references! */ import sun.misc.Unsafe;

/**
 * Demonstrate how to throw an undeclared checked exception.
 * This is a hack, because it uses the forbidden Class {@link sun.misc.Unsafe}.
 */
public class ExceptionTest {

    /**
     * A checked exception.
     */
    public static class MyException extends Exception {
        private static final long serialVersionUID = 5960664994726581924L;
    }

    /**
     * Throw the Exception.
     */
    @SuppressWarnings("restriction")
    public static void throwUndeclared() {
        getUnsafe().throwException(new MyException());
    }

    /**
     * Return an instance of {@link sun.misc.Unsafe}.
     * @return THE instance
     */
    @SuppressWarnings("restriction")
    private static Unsafe getUnsafe() {
        try {

            Field singleoneInstanceField = Unsafe.class.getDeclaredField("theUnsafe");
            singleoneInstanceField.setAccessible(true);
            return (Unsafe) singleoneInstanceField.get(null);

        } catch (IllegalArgumentException e) {
            throw createExceptionForObtainingUnsafe(e);
        } catch (SecurityException e) {
            throw createExceptionForObtainingUnsafe(e);
        } catch (NoSuchFieldException e) {
            throw createExceptionForObtainingUnsafe(e);
        } catch (IllegalAccessException e) {
            throw createExceptionForObtainingUnsafe(e);
        }
    }

    private static RuntimeException createExceptionForObtainingUnsafe(final Throwable cause) {
        return new RuntimeException("error while obtaining sun.misc.Unsafe", cause);
    }


    /**
     * scenario: test that an CheckedException {@link MyException} can be thrown
     * from an method that not declare it.
     */
    @Test(expected = MyException.class)
    public void testUnsingUnsaveToThrowCheckedException() {
        throwUndeclared();
    }
}

안전하지 않은 클래스

낮은 수준의 안전하지 않은 작업을 수행하기 위한 방법 모음입니다.클래스 및 모든 메서드가 공개되어 있지만 신뢰할 수 있는 코드만 클래스의 인스턴스를 가져올 수 있으므로 이 클래스의 사용은 제한됩니다.

그것의 한 가지 용도는 에 있다.java.util.concurrent.atomic★★★★★★★★★★★★★★★★★★:

효율적인 메모리 복사(시스템보다 복사 속도가 빠름)arraycopy() (최소 쇼트블록의 경우). Java LZF Snappy 코덱에서 사용됩니다.이들은 'getLong'과 'putLong'을 사용합니다.이는 바이트 단위로 복사하는 것보다 빠릅니다. 특히 16/32/64 바이트 블록과 같은 것을 복사할 때 효율적입니다.

작업을 , JVM의 재실장에서는 클래스가 되어 있는 을 알 수 .Unsafe이 클래스는 대부분 Java 라이브러리 구현자를 위해 설계되었으며 기본적으로 안전하지 않지만 빠른 프리미티브를 구축하기 위해 필요한 기능을 포함하고 있습니다.예를 들어 원시 필드 오프셋을 가져오고 쓰는 방법, 하드웨어 수준 동기화를 사용하는 방법, 메모리 할당 및 해방 방법 등이 있습니다.이것은 일반 Java 프로그래머가 사용하는 것이 아닙니다.문서화되어 있지 않고 구현에 특화되어 있으며 본질적으로 안전하지 않습니다(따라서 이름!).저는 '하다', '하다', '하다', '하다', '하다', '하다', '하다', '하다', '하다', '하다', '하다', '하다', '하다',SecurityManager는 거의 모든 경우에 접속을 금지합니다.

의 모든 기본 수 합니다.AtomicInteger원어민중요한 것은 다른 라이브러리의 속도를 빠르게 하는 것이므로 일상적인 Java 프로그래밍에서 이를 사용하거나 걱정할 필요가 없습니다.

오프히프 컬렉션은 대량의 메모리를 할당하고 GC의 간섭 없이 사용 후 즉시 할당 해제하는 데 도움이 될 수 있습니다.오프히프 어레이/리스트를 사용하기 위한 라이브러리를 작성했습니다.sun.misc.Unsafe.

나만의 복셀 엔진처럼 대용량 메모리에 효율적으로 액세스하여 할당할 수 있습니다! (Minecraft 스타일의 게임)

제 경험상 JVM은 실제로 필요한 범위 검사를 제거할 수 없는 경우가 많습니다.예를 들어 대규모 어레이에서 반복하고 있지만 실제 메모리 액세스는 루프 내의 비가상* 메서드 호출 아래에 있는 경우에도 JVM은 루프 직전에 한 번이 아니라 각 어레이 액세스에 대해 경계 검사를 수행할 수 있습니다.따라서 큰 성능 향상을 위해 sun.misc를 사용하는 방법을 사용하여 루프 내에서 JVM 경계 검사를 제거할 수 있습니다.메모리에 직접 액세스하는 것은 안전하지 않습니다. 올바른 위치에서 경계 검사를 수행하십시오.(어느 정도 레벨에서는 체크 범위를 좁힐 예정이죠?)
*비가상화(non-virtual)란 클래스/메서드/인스턴스가 정적/최종/무엇을 조합한 것임을 올바르게 보증하고 있기 때문에 JVM이 특정 방법을 동적으로 해결할 필요는 없습니다.

자체 개발한 복셀 엔진의 경우 청크 생성 및 시리얼라이제이션(전체 어레이에 대해 동시에 읽기/쓰기를 수행하던 위치) 중에 성능이 크게 향상되었습니다.결과는 다양할 수 있지만 경계 제거 부족이 문제라면 이것으로 해결됩니다.

여기에는 몇 가지 중대한 문제가 있을 수 있습니다.구체적으로 인터페이스 클라이언트에 경계 검사 없이 메모리에 액세스 할 수 있는 기능을 제공하면 아마 악용될 가능성이 있습니다.(해커도 인터페이스의 클라이언트가 될 수 있다는 것을 잊지 마십시오.특히 Java로 작성된 복셀 엔진의 경우)따라서 메모리 액세스가 악용되지 않도록 인터페이스를 설계하거나 위험한 인터페이스와 혼합되기 에 사용자 데이터를 검증하는 데 매우 주의해야 합니다.체크되지 않은 메모리액세스로 해커가 할 수 있는 치명적인 일을 생각하면 두 가지 방법을 모두 사용하는 것이 가장 좋습니다.

안전하지 않은 어레이, 해시맵, 트리맵 등의 대규모 컬렉션을 구현했습니다.
또한 플래그멘테이션을 회피/최소화하기 위해 안전하지 않은 dlmalloc 개념을 사용하여 메모리 할당기를 구현했습니다.
이것은 동시성에서의 퍼포먼스를 얻는 데 도움이 되었습니다.

Unsafe.park() ★★★★★★★★★★★★★★★★★」Unsafe.unpark()커스텀 동시성 제어 구조와 협력 스케줄링 메커니즘의 구축에 사용됩니다.

본 적은 , 스레드에서 수 가 있는 휘발성을 하고 않은는 사용할 수 .putObjectVolatile에 쓸 때, 그리고 '메인 스레드'에 쓸 때readObjectVolatile다른 스레드에서 희귀 판독을 수행할 때 사용합니다.

현재 사용하는 클래스 중 하나에서 제공하는 기능을 교체해야 할 경우 필요합니다.

커스텀/빠른/콤팩트한 시리얼화/디시리얼화, 고속/큰 버퍼/크기 가능한 버전의 ByteBuffer 또는 현재 지원되지 않는 원자 변수 추가 등이 있습니다.

나는 이 모든 것에 그것을 사용한 적이 있다.

이 방법의 사용 예로는 랜덤 메서드를 들 수 있습니다.랜덤 메서드는 안전하지 않은 사용자가 시드 변경을 호출합니다.

이 사이트에도 몇 가지 용도가 있습니다.

오브젝트는 Java 코드가 일반적으로 허용하는 수준보다 낮은 수준에서 동작할 수 있는 것으로 보입니다.높은 수준의 애플리케이션을 코딩하는 경우 JVM은 메모리 처리 및 기타 작업을 코드 레벨에서 추상화하여 프로그래밍하기 쉬워집니다.안전하지 않은 라이브러리를 사용하면 일반적으로 수행하는 낮은 수준의 작업을 효과적으로 완료할 수 있습니다.

woliveirajr가 기술한 바와 같이 "random()"은 안전하지 않은 것을 사용하여 시드합니다.다른 많은 조작이 안전하지 않은 것에 포함된 allocate Memory() 함수를 사용합니다.

프로그래머로서 이 라이브러리가 필요없지만 저레벨 요소에 대한 엄격한 제어가 도움이 됩니다(그래서 주요 제품에는 어셈블리나 (적어도) C코드가 아직 남아 있습니다).

언급URL : https://stackoverflow.com/questions/5574241/why-does-sun-misc-unsafe-exist-and-how-can-it-be-used-in-the-real-world

반응형