Current main memories are mostly based on DRAM (dynamic random-access memory) or SRAM (static RAM) technologies, which store information as charge in capacitors or transistors. These memories are volatile, i.e. they only keep their contents as long as power is applied to the memory. Persistent (non-volatile) storage, such as flash memory, today is rather expensive and suffers from restrictions such as a very limited amount of write cycles, slow access speed, and the requirement to write information in blocks instead of single bytes.
Recent developments have created persistent main memory semiconductors which have a very large number of write cycles, provide byte-wide access and which have a read/write access speed on the same order of magnitude as normal RAM memories. In addition, they can be significantly cheaper than RAM. Examples are FRAMs in some MSP430 microcontrollers by Texas Instruments  and intel XPoint memory modules for server applications .
However, these new memories also come with a number of challenges, many of which are to be handled on the operating system and programming language side. Persistence as a high-level concept can already be found in early Lisp and Smalltalk  systems. An overview of early challenges of persistence in operating systems can be found in  with a more recent overview in . One problem of these new memories is actually their persistence. In systems with volatile main memory, you can restart the system to obtain a clean state with empty memory. Persistent memory systems retain their contents, so e.g. it is more difficult to get rid of malware that managed to copy itself to the main memory of a system . Another problem is that After the restart of a system, existing pointers may no longer be valid .
Persistent memory is an important topic on the hardware/software interface, since persistent main memories change the properties of a system's memory hierarchy. Future memory hierarchies will include volatile (registers, caches, scratch-pad memories) as well as non-volatile byte-accessible components. Operating systems and languages will have to be able to differentiate between memory types and handle allocations in novel ways. One approach for this can be found in .