Ich habe in einer Spring-Boot-Anwendung ein Problem mit der Speicherverwaltung gestoßen und möchte Ratschläge zum ordnungsgemäßen Speicher des direkten Speichers erhalten. VM < /li>
Federstiefel: Version@RequiredArgsConstructor
@RestController
public class MyEntityController {
private final MyEntityService service;
@PostMapping("/file")
public ResponseEntity addedFileInVersion(MultipartHttpServletRequest request) throws IOException {
return service.addFileVersion(request);
}
}
@Service
@Slf4j
@RequiredArgsConstructor
public class MyEntityService {
@Transactional
public ResponseEntity addFileVersion(MultipartHttpServletRequest request) throws IOException {
try {
log.info("Before reading : {} bytes", getDirectMemoryUsed());
MultipartFile file = request.getFile("file");
if (file == null) {
return ResponseEntity.badRequest().body("The file has not been transferred or the file is empty.");
}
byte[] array = file.getBytes();
String fileName = file.getOriginalFilename();
storeFile(array, fileName);
log.info("After reading : {} bytes", getDirectMemoryUsed());
return ResponseEntity.ok("ok");
} catch (IOException e) {
log.error("Error processing file", e);
return ResponseEntity.badRequest().body("Error when uploading file: " + e.GetMessage());
} finally {
log.info("Finally reading : {} bytes", getDirectMemoryUsed());
}
}
private void storeFile(byte[] array, String path) throws IOException {
String decode = UriUtils.decode(path, StandardCharsets.UTF_8.toString());
synchronized (this) {
Path savedPath = Paths.get("/storage/tmp", decode);
if (Files.notExists(savedPath.getParent())) {
Files.createDirectories(savedPath.getParent());
}
Files.write(savedPath, array);
}
}
private double getDirectMemoryUsed() {
List bufferPoolMXBeans = ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class);
for (BufferPoolMXBean pool : bufferPoolMXBeans) {
if ("direct".equals(pool.getName())) {
return pool.getMemoryUsed();
}
}
return 0;
}
}
< /code>
Beim Senden von Dateien beobachte ich eine Erhöhung der Verwendung des direkten Speichers, der nach der Verarbeitung der Datei nicht abnimmt. The logs show the following:
Step
Memory
Before reading
24576.0 bytes
After reading
9.58496462E8 bytes
Finally reading
9.58496462E8 bytes
Before reading
9.58512846E8 bytes
After Lesen < /td>
1.916984732E9 Bytes < /td>
< /tr>
Schließlich Lesen < /td>
1.916984732e9 bytes < /td>
< /tro />
Es ist zu erkennen, dass nach der Verarbeitung der Datei der direkte Speicher nicht veröffentlicht wird. Ich weiß auch, dass sich der direkte Speicher außerhalb des JVM -Haufens befindet und nicht direkt vom Müllsammler verwaltet wird. In den meisten Fällen wird die Verwendung von Reinigern nicht empfohlen. Laden der gesamten Datei in den Speicher und wie Sie den direkten Speicher in solchen Szenarien richtig freilegen?
Direkter Speicher wird beim Herunterladen von Dateien nicht veröffentlicht ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post