Hi, Is it possible to self-update uC program? I want update from arduino to arduino via I2C communication.
That is exactly the purpose of a bootloader so, yes, it is possible.
See the section “Self-Programming the Flash” in the datasheet.
One Arduino can program another, and there are an number of implementations around. See for example Atmega_Board_Programmer by Nick Gammon (http://www.gammon.com.au/forum/?id=11635) and Optiboot by Bill Westfield (https://github.com/WestfW/OptiLoader). These are made for writing bootloaders, but are easily adapted for any code. They use ICSP, and need 4 programming wires plus power.
Programming via another communication protocol would require use of a bootloader. I'm not aware of any bootloaders that use I2C, nor do I know of any existing Arduino code which can talk to a bootloader. So the answer to your question is yes, in theory, although it might be a lot of work.