Skip to content

Heap consumption until crash #254

@mathieucarbou

Description

@mathieucarbou

Discussed in #253

Originally posted by gluca August 1, 2025

Platform

ESP32

IDE / Tooling

Arduino (IDE/CLI)

What happened?

Free memory heavy reduction after each client request until crash. The effect is huge using firefox as browser while is relatively small using chrome.
Each time you request any URL (in the example i made 2 hooks, one for "/" and one for all others (not found) pages) the free memory in heap reduces drastically, using firefox as client browser (roughly 5 to 6kbytes for each request). Using chrome the heap size reduction is less evident but still here (500 to 600 bytes with recovery), as you can see from Serial output i provided and that can be reproduced by my example code.

Stack Trace

No Stack trace until it crashes for out of memory. Output of main loop (showing memory degradation) follows:

Chrome (Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36)

Memory - Free:174424, Min:171912, Largest:110580
Memory - Free:174424, Min:171912, Largest:110580
Serving request for /-Memory - Free:172332, Min:167872, Largest:110580
Memory - Free:172332, Min:167872, Largest:110580
Memory - Free:172332, Min:167872, Largest:110580
Memory - Free:173500, Min:167872, Largest:110580
Memory - Free:173500, Min:167872, Largest:110580
Serving request for /-Memory - Free:172688, Min:167312, Largest:110580
Memory - Free:172688, Min:167312, Largest:110580
Memory - Free:172688, Min:167312, Largest:110580
Memory - Free:173272, Min:167312, Largest:110580
Memory - Free:173272, Min:167312, Largest:110580
Serving request for /-Memory - Free:171648, Min:166260, Largest:110580
Memory - Free:171648, Min:166260, Largest:110580
Memory - Free:171648, Min:166260, Largest:110580
Memory - Free:172816, Min:166260, Largest:110580
Memory - Free:172816, Min:166260, Largest:110580
Serving request for /-Memory - Free:172004, Min:166260, Largest:110580
Memory - Free:172004, Min:166260, Largest:110580
Memory - Free:172004, Min:166260, Largest:110580
Memory - Free:172588, Min:166260, Largest:110580
Memory - Free:172588, Min:166260, Largest:110580
Serving request for /-Memory - Free:171776, Min:166260, Largest:110580
Memory - Free:171776, Min:166260, Largest:110580
Memory - Free:171776, Min:166260, Largest:110580
Memory - Free:172360, Min:166260, Largest:110580
Memory - Free:172360, Min:166260, Largest:110580
Serving request for /-Memory - Free:171548, Min:166152, Largest:110580
Memory - Free:171548, Min:166152, Largest:110580
Memory - Free:171548, Min:166152, Largest:110580
Memory - Free:172132, Min:166152, Largest:110580
Memory - Free:172132, Min:166152, Largest:110580

Firefox: (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:141.0) Gecko/20100101 Firefox/141.0)

Memory - Free:172132, Min:166152, Largest:110580
Memory - Free:172132, Min:166152, Largest:110580
Serving request for /-Memory - Free:166292, Min:163768, Largest:110580
Memory - Free:166292, Min:163768, Largest:110580
Memory - Free:166292, Min:163768, Largest:110580
Serving request for /-Memory - Free:160492, Min:158056, Largest:110580
Memory - Free:160492, Min:157964, Largest:110580
Memory - Free:160492, Min:157964, Largest:110580
Memory - Free:160720, Min:157964, Largest:110580
Serving request for /-Memory - Free:154880, Min:152356, Largest:110580
Memory - Free:154880, Min:152356, Largest:110580
Memory - Free:154880, Min:152356, Largest:110580
Serving request for /-Memory - Free:149040, Min:146516, Largest:110580
Memory - Free:149040, Min:146516, Largest:110580
Memory - Free:149040, Min:146516, Largest:110580

Minimal Reproductible Example (MRE)

#define WEB_SERVER_PORT 8080

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

static AsyncWebServer _server(WEB_SERVER_PORT);

const char *ssid          = "mySSD";
const char *password = "myPWD";

void wsConnectAP(const char * ssid, const char * pwd) {
  Serial.println("Connecting to wifi");
  WiFi.begin(ssid,pwd);
  int status = WiFi.status();
  while(status!= WL_CONNECTED) {
    delay(1000);
    status = WiFi.status();
  }
  Serial.println("Connected");
}

void wsStartServer() {
  wsSetHandlers();
  _server.begin();
}

void wsSetHandlers() {

  _server.on("/",HTTP_GET,     
    [](AsyncWebServerRequest * request){
        Serial.print("Serving request for /-");
        request->send(200,"application/json","{\"message\":\"Hello World\"}");
    });

    _server.onNotFound(
      [] (AsyncWebServerRequest *request) {
        Serial.print("Serving request for notFound-");
        request->send(404, "application/json", "{\"message\":\"Not Found\"}");
      });
}

void setup() {
  Serial.begin(9600);
  while(!Serial);
  wsConnectAP(ssid, password);
  wsStartServer();
}

void loop() {
    multi_heap_info_t info;
    heap_caps_get_info(&info, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); // internal RAM, memory capable to store data or to create new task
    Serial.printf("Memory - Free:%u, Min:%u, Largest:%u\n",   
    info.total_free_bytes,
    info.minimum_free_bytes,
    info.largest_free_block);
    delay(1000);
}

I confirm that:

  • I have read the documentation.
  • I have searched for similar discussions.
  • I have searched for similar issues.
  • I have looked at the examples.
  • I have upgraded to the lasted version of ESPAsyncWebServer (and AsyncTCP for ESP32).

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions