Поскольку вы не можете получить доступ к 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;
}
}
Быстрый и грязный способ получить фактический адрес кучи JVM - это перейти в WinDbg, подключиться к JVM и выполнить одну команду! Address. Где-то около 0x2 ??????? (Он различается между версиями jvm, но остается статичным для этой версии) будет большим VAD с пометкой PAGE_EXECUTE_READWRITE, это куча вашей JVM в памяти процесса.
Чтобы подтвердить, вы можете установить точку останова на kernel32! VirtualAlloc и при инициализации JVM в модуле JVM.DLL вы нажмете на вызов VirtualAlloc, показывающий выделение jvm его кучи. Если вы посмотрите код этого звонка, вы увидите, как вычисляется адрес.
Вернемся немного назад ... Не могли бы вы использовать кучу Java фиксированного размера? На этом этапе исчезают опасения по поводу перераспределения и фрагментации.
При автономном вызове Java, который предполагает указание чего-то вроде -Xmx500m и -Xms500m для кучи размером 500 МБ. Вам нужно будет перевести это в то, что хочет Matlab.
ГХ может перемещать данные в любое время для сжатия памяти. Таким образом, для объектов в Java Heap нет фиксированной точки. Вы можете использовать ByteBuffer.allocateDirect (), который выделяет память в пространстве «C», а не в куче, и фиксируется в памяти.
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!)
Я не думаю, что есть способ делать то, что вы хотите, без использования настраиваемой JVM. Теоретически вы можете использовать OpenJDK и исправить его или включить трассировку (не уверен, подходит ли она вашим потребностям). Я думаю, что инструмент внешнего мониторинга, такой как проводник процессов , может решить вашу проблему