This one is a very interesting question.
With the primitive the allocation will be in the stack and will cost its needed 4 bytes give or take some rounding.
But things really begin to grow when talking about the wrapper.
If we compare it to C++, the fact that the 4 bytes will be allocated in the heap, makes the e1 a pointer.
Assuming we are using a 64bit machine, e1 will take 8bytes in the stack (+rounding).
And the heap data chunk has at least a small 4-8bytes header.
Looking inside the implementation of these types I don't see more memory used for each instance as all helper members and constants are static, so all instances will use the same data chunk in the 'data-segment' used for this type.
So, adding all this shows that the wrapper's allocation will always be bigger than the primitive.
For example - with extremely rough calculation you get something like:
Primitive: int -> 4 bytes, Wrapper: Integer -> 8(stack) + 4 + 4 = 16 bytes
As for performance, it seems that primitives will be manipulated way faster than wrappers, but this is for another discussion.
Hope this info had helped.
e1here, the reference itself will be on the stack, but the object that it refers to will be on the heap.