Direkter Speicher wird beim Herunterladen von Dateien nicht veröffentlichtJava

Java-Forum
Anonymous
 Direkter Speicher wird beim Herunterladen von Dateien nicht veröffentlicht

Post by Anonymous »

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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post