♻️ Refactor: cleanupMarkers util eingeführt für alle Marker-Typen + Feature: Heap-Memory-Monitoring über Redux-Slice mit Auto-Reload bei >8GB

This commit is contained in:
ISA
2025-06-06 11:36:06 +02:00
parent 1ec0a8a611
commit 51d2d58f8e
6 changed files with 67 additions and 2 deletions

View File

@@ -4,6 +4,29 @@ Alle bedeutenden Änderungen an diesem Projekt werden in dieser Datei dokumentie
---
## [1.1.238] 2025-06-06
### ♻️ Refactor
- Zentrale `cleanupMarkers()`-Funktion erstellt, um Memory Leaks bei Leaflet-Markern zu vermeiden.
- Marker-Cleanup in `MapComponent.js`, `createAndSetDevices.js`, `setupPOIs.js` und `markerUtils.js`
integriert.
- Marker werden jetzt zuverlässig bei Kartenwechsel oder Neuladung entfernt.
### ✨ Feature
- Neue Überwachung des Speicherverbrauchs über `monitorMemory.js`.
- Redux-Slice `heapMonitorSlice.js` speichert regelmäßig `usedJSHeapSize`.
- Heap-Wachstum kann live über Redux DevTools beobachtet werden.
- Automatischer Reload der Seite bei mehr als **8 GB** Heap-Verbrauch (z.B. bei iFrame-Nutzung in
TALAS.web).
### 🔧 Version
- 📦 `appVersion.js` auf Version **1.1.238** erhöht
---
## [1.1.232] 2025-06-04
### ✨ Added

View File

@@ -80,6 +80,7 @@ import useDataUpdater from "@/hooks/useDataUpdater";
import { cleanupPolylinesForMemory } from "@/utils/polylines/cleanupPolylinesForMemory";
import { cleanupMarkers } from "@/utils/common/cleanupMarkers";
import { monitorHeapAndReload } from "@/utils/common/monitorMemory";
import { monitorHeapWithRedux } from "@/utils/common/monitorMemory";
//-----------------------------------------------------------------------------------------------------
const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
//-------------------------------
@@ -787,6 +788,12 @@ const MapComponent = ({ locations, onLocationUpdate, lineCoordinates }) => {
return () => clearInterval(interval); // wichtig: aufräumen!
}, []);
//--------------------------------------------
useEffect(() => {
const interval = monitorHeapWithRedux(10000); // alle 10s
return () => clearInterval(interval);
}, []);
//---------------------------------------------
//--------------------------------------------
return (

View File

@@ -1,2 +1,2 @@
// /config/appVersion
export const APP_VERSION = "1.1.238";
export const APP_VERSION = "1.1.239";

View File

@@ -0,0 +1,22 @@
import { createSlice } from "@reduxjs/toolkit";
const initialState = {
heapBytes: 0,
heapMB: 0,
lastUpdated: null,
};
export const heapMonitorSlice = createSlice({
name: "heapMonitor",
initialState,
reducers: {
updateHeap(state, action) {
state.heapBytes = action.payload;
state.heapMB = +(action.payload / 1024 / 1024).toFixed(2);
state.lastUpdated = new Date().toISOString();
},
},
});
export const { updateHeap } = heapMonitorSlice.actions;
export default heapMonitorSlice.reducer;

View File

@@ -35,6 +35,7 @@ import selectedDeviceReducer from "./slices/selectedDeviceSlice";
import selectedAreaReducer from "./slices/selectedAreaSlice";
import zoomTriggerReducer from "./slices/zoomTriggerSlice";
import urlParameterReducer from "./slices/urlParameterSlice";
import heapMonitorReducer from "./slices/heapMonitorSlice";
//----------------
export const store = configureStore({
@@ -68,5 +69,6 @@ export const store = configureStore({
poiTyp: poiTypReducer,
poiIconsData: poiIconsDataReducer,
poiMarkers: poiMarkersReducer,
heapMonitor: heapMonitorReducer,
},
});

View File

@@ -1,3 +1,6 @@
import { store } from "@/redux/store";
import { updateHeap } from "@/redux/slices/heapMonitorSlice";
export const monitorHeapAndReload = (limitInGB = 8, intervalMs = 10000) => {
const limit = limitInGB * 1024 * 1024 * 1024;
@@ -7,8 +10,16 @@ export const monitorHeapAndReload = (limitInGB = 8, intervalMs = 10000) => {
console.log("Heap:", (heap / 1024 / 1024).toFixed(2), "MB");
if (heap > limit) {
console.warn("🚨 Heap-Limit erreicht. Reload wird ausgeführt.");
//console.warn("🚨 Heap-Limit erreicht. Reload wird ausgeführt.");
location.reload();
}
store.dispatch(updateHeap(heap));
}, intervalMs);
};
export const monitorHeapWithRedux = (intervalMs = 10000) => {
return setInterval(() => {
const heap = performance.memory?.usedJSHeapSize || 0;
store.dispatch(updateHeap(heap));
}, intervalMs);
};