Use instanced geometry (and objects) - instanced duplicates won't consume memory.
- Alt+D will link the mesh data and save memory (Shift+D will not). You can have different materials applied to objects with the same mesh (link the material to object not to mesh)
- Use Dupliverts/Duplifaces or Group Instances - this links whole objects (groups). This will save the most memory.
- Use linked object (groups) from another .blend (Ctrl+Alt+O) multiple times - same memory savings as previous.
Divide your scene objects into multiple render layers and combine them into a single image in the compositor. This way you can defer the memory load across multiple rendering sessions.
For Blender 2.78 and up: Bindless Textures are now supported on GPU, which means only limit is now VRAM and a CUDA limit of 256 textures. Cycles now has support for single-channel textures - therefore no need to pack textures.
For older Blender versions: pack your black & white textures (masks, influences, specular maps, etc.) into channels of color textures (1 color texture with alpha - tga/png - can store 4 BW textures or 1 RGB and a mask). This can save the GPU memory in texture heavy scenes significantly. Old Cycles does not use single-channel for BW.