Wikipedia has a basic overview [0]. Basically, they tried to do what Java did - there is no raw pointers in instruction set, but only special "access descriptors" that always point to a valid object. Microcode handles the rest, like garbage collection, and type checking.
> Each system object has a type field which is checked by microcode, such that a Port Object cannot be used where a Carrier Object is needed. User programs can define new object types...
If there are no microcode bugs, this should theoretically mean full safety and lack of unexpected behavior. But unlike Java with JIT, they were always checking every access - no wonder it turned out to be so slow...
[0] https://en.wikipedia.org/wiki/Intel_iAPX_432#Object-oriented...