2009-07-14 6 views
0

클라이언트가 가진 데이터의 양에 따라 더 많은 메모리가 필요한 애플릿이 있습니다.- 애플릿과 독립 실행 형 Java 프로세스 사이의 Xmx 차이점

일반적으로 Java 1.6 최신 버전을 사용하는 것이 좋지만 Java 1.5+를 실제로 지원하므로 애플릿에서 "메모리가 부족합니다"라는 경고와 함께 대화 상자를 표시하고 어디로 가야하는지 지침을 표시합니다 기억.

그러나 애플릿과 독립 실행 형 프로세스에서 -Xmx가 다르게 작동하고 실제로 애플릿에 충분한 메모리가 있는지 확인할 수 없다는 사실에 놀랐습니다.

  • 애플릿이 다음 인수 수신 : 여기

    그것을 수행하는 방법이다

    • 매개 변수 이름 = "java_arguments"값을 = - 물론이 자바에서 작동 ("Xmx153m"1.6 업데이트를 10, 그렇지 않은 경우는 자바 1.5과 자바 1.6 이전 업데이트에서 10)
    • 매개 변수 이름 = "required.memory"값을 64M를 얻을 것이다 = "153"런타임에
  • , 우리 우리 143,589,376 얻을 애플릿에서 153M의 한도 Runtime.getRuntime(). maxMemory()
  • 으로 required.memory 비교하지만 독립형 애플리케이션에서는 155,516,928
  • 153 * 1000 * 1000 = 153,000,000 얻을 (나는 1024를 1K에 대해 사용하고 있지 않다.) 분명히 143589376 이상이다.

JVM에서 근사값을 피하기 위해 0.9의 인자를 사용한다면 잘 작동하는 것처럼 보일 것이다. 적당한 값 - 0.9? 이 제한을 어떻게 계산하며 독립형 응용 프로그램과 애플릿에서 다른 점은 무엇입니까?

답변

2

자바 메모리의 시간.

먼저 Java 메모리 부족 (실제로는 OutOfMemoryError을 얻음)은 실행중인 GC의 특성에 영향을받습니다.

이름에서 알 수있는 것과는 반대로 실제로 메모리가 부족한 상태에서 OutOfMemoryError를 얻을 수 있습니다. 런타임이 지출 지출을 결정할 때 발생하는 GC'ing (source, 그곳에 묻혀 있음).

또한 종류의 메모리 중이 부족하여 OutOfMemoryError를 얻을 수 있습니다. Java GC는 세대 별 수집가이며, 세대 중 하나를 다 써 버린 경우 ("tenured"라고 말하고 싶지만 잘못 될 수 있음) 기억을 잃을 수도 있습니다. 즉, OS보기에서 힙 공간을 남겨 둘 수 있지만 Java 힙에는 아무 것도 할당 할 수 없습니다.

마지막으로 일부 힙 공간을 차지할 수있는 GC와 관련된 실제 오버 헤드가 있습니다.

귀하의 경우에 발생 될 가능성이 무엇

, 다음에 약간의 변형은 다음과 같습니다 코드가 독립 및 애플릿 컨텍스트 모두에서 실행, 각 상황에 맞는 다른 보안 관리자와 다른 시작 동작이있다; 이것은 다른 종류의 클래스 (영구 생성으로 두드려 짐)가 서로 다른 종속성과 관련되어 있음을 의미합니다. 나는 애플릿 "stack"이 그들의 행동에보다 강렬한 제약이 주어지면 더 두껍고, 아마 maxMemory()의 차이를 설명 할 것입니다.

간단히 말해, 사용 가능한 메모리의 차이는 Java 런타임이 자체 작업을 위해 예약 한 메모리의 일부 변경 때문일 수 있습니다. 이것은 GC 관련, 보안 정책 관련 또는 독립형 애플릿 환경과 비교하여로드 된 다른 클래스 일 수 있습니다. Runtime.maxMemory()는 반환 할 내용을 결정할 때 위의 "메모리 부족"조건을 고려합니다. 따라서 0.9 값은 구현상의 부작용 일 수 있으며, 미래에는 변할 수 있습니다.

0

케빈, 실제로 애플릿이 데스크톱 응용 프로그램과 비교할 때 어떻게 달라지는 지 이해할 수 있지만, 큰 차이는 애플릿과 애플릿간에 사용할 수있는 최대 크기 (생각보다 크다)입니다. 데스크톱 응용 프로그램은 ~ 8 ​​%입니다. "애플릿"스택이 "동작에보다 엄격한 제약 조건이 주어지면 더 두껍습니다."애플릿이 독립 실행 형이 아닌 최대 메모리를 확보 할 것으로 기대했습니다. 번역.

필자는 애플릿과 응용 프로그램 사이를 측정했습니다. 둘 다 동일한 매개 변수 (-Xmx128M)를 받았으며 둘 다 동일한 JVM에서 실행 중임 - Java HotSpot (TM) 64 비트 서버 VM 버전 11.3-b02 (애플릿이 클라이언트 JVM으로 실행 중이며 데스크탑이

  • 애플릿 : -D__jvm_launched = 426431678538 -Xbootclasspath/서버 JVM은 있지만, 모두가 서버 JVM) 현실 다른 매개 변수를 수신 물론

    JVM들,하지만 주요 아무것도 (내가 생각하는)와 것 같다 : /usr/jvm/64/jdk1.6.0_13/jre/lib/deploy.jar : /usr/jvm/64/jdk1.6.0_13/jre/lib/javaws.jar :/usr/jvm/64/jdk1. 6.0_13/jre/lib/plugin.jar -Xmx128m

  • 독립 실행 형 : -Xrun JDWP : 트랜스 = dt_socket 주소 = 127.0.0.1 : 54,876 = Y, 서버 중단 = N -Xmx128m -Dfile.encoding = UTF-8

애플릿 : 최대. 메모리 = 119.314K

    • PS 에덴 공간 : 14,592K
    • PS 생존자 공간 : 14.528K
    • PS 올드 세대 : 87.424K
      • 총 : 116.544K
  • 비 힙
    • 의 Mem 풀 코드 캐시 : 49.152K
    • 의 Mem 풀 PS 파마 세대 : 86.016K
      • 총 : 135.
    • 168K

데스크탑 : 최대. 메모리 = 129.302K

    • PS 에덴 공간 : 8.704K
    • PS 생존자 공간 : 3.008K
    • PS 올드 세대 : 총 116.544K
      • : 126.272K
  • 비 힙
    • 의 Mem 풀 코드 캐시 : 49.152K
    • 의 Mem 풀 PS 파마 세대 : 65.536K
      • 총 : 135.168K

이 두 JVM 간의 큰 차이점

  • PS Perm Gen는 애플릿이 더 큰 덩어리를 가졌습니다. 애플릿이 독립형 버전과 비교하여 아마도 추가 클래스를로드 할 것이기 때문에 의미가 있습니다. (이 경우에도 "Old Gen"는 훨씬 작습니다. 그 추가 클래스는 결국 "Old Gen"에 들어갑니다)
  • 힙 메모리는 Eden/Survivor/Old Gen 사이의 완전히 다른 비율입니다. Applet의 Old Gen는 독립 실행 형 Old Gen의 75 %이며, 나는 애플릿이나 데스크톱 애플리케이션으로 애플리케이션을 실행할 때 아무런 차이가 없어야하므로 (거의) 같은 메모리 모델을 기대한다면 친절하다.

이제 maxMemory 비율을 계산하는 방법을 모르겠다. (실제로 0.9는 미래의 JVM 버전에서는 유효하지 않을 수있다.) 그러나 애플리케이션에 메모리가 부족할 수있다. 애플릿으로 실행될 때 안전성을 위해 애플릿으로 실행될 때 ~ 10-15 %의 최대 메모리를 늘려야합니다.

같은 힙 비율 (동일한 시스템에서)과 작은 힙 (특히 애플릿이 추가 클래스가 필요하다고 생각할 때)이 왜 그렇게 확신 할 수 없습니다.

이유가 무엇입니까? 나는 지금 골동품이다. 애플릿이 최대량의 메모리를 가지고 있는지 확인해야 할 필요성을 넘어서고있다.

관련 문제