Don't forget that RAM and program memory are completely different.Do you have large constant arrays or tables?
but I have many constant string for debugging by serial.print.
The smoking gun
I don't know how many print strings you've got (hint) but each one occupies RAM.
I thought that serial.print used the ROM and not RAM, but probably you are right,
Can someone explain?
Now I'm shortening all the messages in order to save a ton of bytes
You can put strings into PROGMEM, but you need to handle the printing yourself, but it is fairly simple.