### Godot version

4.1.stable

### System information

Godot v4.1.stable - elementary OS 7 Horus 7 (Ubuntu 22.04) - Vulkan (Mobile) - dedicated AMD Radeon RX 6600 (RADV NAVI23) () - Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz (6 Threads)

### Issue description

Tilemap has a memory leak where if you repeatedly change the tile (that has collidable physics) of cells, the static memory (shown in the debugger) increases and stays there. This only happens if you have a physics layer in the Tileset and one of the tiles is collidable.

Also the memory usage is extremely high even when generating the map once. A 1000x1000 tiles map uses 1.4 GB of memory!

Workaround is simple. Simply clear the tilemap with `clear()` before you change the map.

### Steps to reproduce

1. Create a TileMap node
2. Create a TileSet containing two tiles on the atlas coordinates `(0, 0)` and `(1, 0)`
3. Create a Physics Layer in the TileSet and make one of the tiles fully collidable
4. Attach a script to the TileMap
5. Set the script to this
```
extends TileMap

func _process(delta):
	if Input.is_key_pressed(KEY_SPACE):
		for i in range(5000):
			set_cell(0, Vector2i(i, 0), 0, Vector2i(randi_range(0, 1), 0))
```
6. Run the scene
7. Go into "Debugger" tab in the editor while the scene is running
8. Press the "Monitors" tab press and observe the "Static" memory
9. Now hold down the space bar and observe the static memory climbing but never coming down
10. To workaround the problem simply add `clear()` before the loop like this:
```
extends TileMap

func _process(delta):
	if Input.is_key_pressed(KEY_SPACE):
		clear()
		for i in range(5000):
			set_cell(0, Vector2i(i, 0), 0, Vector2i(randi_range(0, 1), 0))
```

### Minimal reproduction project

[tilemapmemoryleak.zip](https://github.com/godotengine/godot/files/12064640/tilemapmemoryleak.zip)
int get_layers_count() const;
	void add_layer(int p_to_pos);
	void move_layer(int p_layer, int p_to_pos);
	void remove_layer(int p_layer);
	void set_layer_name(int p_layer, String p_name);
	String get_layer_name(int p_layer) const;
	void set_layer_enabled(int p_layer, bool p_visible);
	bool is_layer_enabled(int p_layer) const;
	void set_layer_modulate(int p_layer, Color p_modulate);
	Color get_layer_modulate(int p_layer) const;
	void set_layer_y_sort_enabled(int p_layer, bool p_enabled);
	bool is_layer_y_sort_enabled(int p_layer) const;
	void set_layer_y_sort_origin(int p_layer, int p_y_sort_origin);
	int get_layer_y_sort_origin(int p_layer) const;
	void set_layer_z_index(int p_layer, int p_z_index);
	int get_layer_z_index(int p_layer) const;
	void set_selected_layer(int p_layer_id); 
	int get_selected_layer() const;
	void set_collision_animatable(bool p_enabled);
	bool is_collision_animatable() const;
	
	void set_collision_visibility_mode(VisibilityMode p_show_collision);
	VisibilityMode get_collision_visibility_mode();
	void set_navigation_visibility_mode(VisibilityMode p_show_navigation);
	VisibilityMode get_navigation_visibility_mode();
	void set_navigation_map(int p_layer, RID p_map);
	RID get_navigation_map(int p_layer) const;
	
	void set_cell(int p_layer, const Vector2i &p_coords, int p_source_id = TileSet::INVALID_SOURCE, const Vector2i p_atlas_coords = TileSetSource::INVALID_ATLAS_COORDS, int p_alternative_tile = 0);
	void erase_cell(int p_layer, const Vector2i &p_coords);