Source: https://www.cs.usfca.edu/~parrt/doc/java/JavaObjectModel-notes.pdf