Как получить адрес памяти "кучи" Java?

Поскольку вы не можете получить доступ к this внутри статического метода getDerivedStateFromProps, вам придется сохранять или возвращать состояние, выполняя что-то вроде return { showDialog: true };, что эквивалентно this.setState({showDialog: true}). Таким образом, вы можете проверить состояние в componentDidUpdate методе жизненного цикла, который будет срабатывать только в том случае, если getDerivedStateFromProps возвращает значение, которое не является нулевым.

  componentDidUpdate(prevProps, prevState) {
     if(this.state.showDialog){
           this.showDialog();
      }
     if(this.state.updateDialog){
      this.props.DeleteDialogActionsCreator.updateDialog();
     }
  }




   getDerivedStateFromProps(nextProps, prevState) {
          switch (nextProps.actionType) {
            case DeleteDialogActions.SHOW_DELETE_DIALOG:
            case DeleteDialogActions.HIDE_DELETE_DIALOG:
                 return { showDialog: true };
                break;
            case DeleteDialogActions.DELETE_ITEM_SUCCESS:
                 return { updateDialog: true };
                break;
            default:
                 return null;
                break;
        }
   }
7
задан Andrew Janke 13 May 2009 в 22:01
поделиться

5 ответов

Быстрый и грязный способ получить фактический адрес кучи JVM - это перейти в WinDbg, подключиться к JVM и выполнить одну команду! Address. Где-то около 0x2 ??????? (Он различается между версиями jvm, но остается статичным для этой версии) будет большим VAD с пометкой PAGE_EXECUTE_READWRITE, это куча вашей JVM в памяти процесса.

Чтобы подтвердить, вы можете установить точку останова на kernel32! VirtualAlloc и при инициализации JVM в модуле JVM.DLL вы нажмете на вызов VirtualAlloc, показывающий выделение jvm его кучи. Если вы посмотрите код этого звонка, вы увидите, как вычисляется адрес.

2
ответ дан 7 December 2019 в 12:24
поделиться

Вернемся немного назад ... Не могли бы вы использовать кучу Java фиксированного размера? На этом этапе исчезают опасения по поводу перераспределения и фрагментации.

При автономном вызове Java, который предполагает указание чего-то вроде -Xmx500m и -Xms500m для кучи размером 500 МБ. Вам нужно будет перевести это в то, что хочет Matlab.

2
ответ дан 7 December 2019 в 12:24
поделиться

ГХ может перемещать данные в любое время для сжатия памяти. Таким образом, для объектов в Java Heap нет фиксированной точки. Вы можете использовать ByteBuffer.allocateDirect (), который выделяет память в пространстве «C», а не в куче, и фиксируется в памяти.

0
ответ дан 7 December 2019 в 12:24
поделиться

If you just want to get the JVM heap to shrink you could try playing with the gc parameters such as -XX:MaxHeapFreeRatio (see http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp)

I don't think you can get a pointer to the Java heap with JNI. However, the Java heap is just memory allocated to the process by Windows from one of the process heaps.

You can get at the process heaps from your C++ code using the GetProcessHeaps function (http://msdn.microsoft.com/en-us/library/aa366571(VS.85).aspx) and then start walking through them with the HeapWalk function. There's a good example at http://www.abstraction.net/content/articles/analyzing%20the%20heaps%20of%20a%20win32%20process.htm. You might be able to spot which allocated blocks are used by the Java heap by looking for certain patterns of bytes (the JVM source code might give you some clues as to what to look for, but good luck figuring that out!)

1
ответ дан 7 December 2019 в 12:24
поделиться

Я не думаю, что есть способ делать то, что вы хотите, без использования настраиваемой JVM. Теоретически вы можете использовать OpenJDK и исправить его или включить трассировку (не уверен, подходит ли она вашим потребностям). Я думаю, что инструмент внешнего мониторинга, такой как проводник процессов , может решить вашу проблему

0
ответ дан 7 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: