Garbage Collector Output Message Explanation

Could anyone explain the meaning of each item listed in the garbage collection output

For example:
GC: 4msec 56184 bytes used, 8196 bytes available
Type 0F (STRING ): 2232 bytes
Type 11 (CLASS ): 8064 bytes
Type 12 (VALUETYPE ): 948 bytes
Type 13 (SZARRAY ): 10896 bytes
Type 15 (FREEBLOCK ): 8196 bytes
Type 17 (ASSEMBLY ): 16512 bytes
Type 18 (WEAKCLASS ): 48 bytes
Type 19 (REFLECTION ): 48 bytes
Type 1B (DELEGATE_HEAD ): 1188 bytes
Type 1D (OBJECT_TO_EVENT ): 552 bytes
Type 1E (BINARY_BLOB_HEAD ): 6984 bytes
Type 1F (THREAD ): 2304 bytes
Type 20 (SUBTHREAD ): 288 bytes
Type 21 (STACK_FRAME ): 3528 bytes
Type 23 (LOCK_HEAD ): 60 bytes
Type 24 (LOCK_OWNER_HEAD ): 24 bytes
Type 27 (FINALIZER_HEAD ): 576 bytes
Type 31 (IO_PORT ): 612 bytes
Type 34 (APPDOMAIN_HEAD ): 72 bytes
Type 36 (APPDOMAIN_ASSEMBLY ): 1248 bytes

STRING and VALUETYPE and FREEBLOCKS are intuitive but others?
I think knowing the meaning of these items can help develop a better firmware.

Thanks.

Some of these are internal structures/objects that don’t have one-to-one correspondence with what you create in code. The best way to learn about these is to get Porting Kit source code and poke around.