Long-lived and adaptive implementations of a snapshot and immediate snapshot objects in the read/write shared-memory model are presented. In [ast99a] we have presented adaptive algorithms for mutual exclusion, collect and snapshot. However, the collect and snapshot algorithms were adaptive only when the number of local primitive operations that a process performs are ignored, i.e., not counted. The number of primitive local steps (operations that do not access the shared memory) in the collect and snapshot operations presented in [ast99a] is O(N k^3) and O(N k^4) respectively where N is the total number of processes in the system and k is the encountered contention. Here we developed new techniques that enabled us to achieve truly adaptive implementations in which the step complexity (combined local and shared) of any operation is bounded by a function of the number of processes that are concurrent with the operation, in particular, O(k^4) for the snapshot (which is also a collect) implementation.