JAVA, 81 79 78 bytes
JAVA (HotSpot) 71 70 bytes
Más corto que otras respuestas de Java en el momento en que publiqué (81, más tarde 79 bytes):
class A{public static void main(String[]a){String x="1";for(;;)x+=x.intern();}}
Según lo sugerido por @Olivier Grégoire, se puede guardar un byte adicional:
class A{public static void main(String[]a){for(String x="1";;)x+=x.intern();}}
Colocar x+=x.intern()como el incremento de bucle for no ayudaría en nada, porque todavía se necesita un punto y coma para finalizar la instrucción for.
Según lo sugerido por @ETHproductions, solo usando x+=xtrabajos también:
class A{public static void main(String[]a){String x="1";for(;;)x+=x;}}
Lo que también puede beneficiarse del consejo de @Olivier Grégoire:
class A{public static void main(String[]a){for(String x="1";;)x+=x;}}
Mis únicas dudas sobre eso es que no se garantiza que se asignen datos en el montón , ya que una JVM eficiente puede darse cuenta fácilmente de que xnunca escapa a la función local. El uso intern()evita esta preocupación porque las cadenas internadas finalmente terminan almacenadas en un campo estático. Sin embargo, HotSpot genera un OutOfMemoryErrorcódigo para ese código, así que supongo que está bien.
Actualización: @Olivier Gregoire también señaló que el x+=xcódigo puede ejecutarse en StringIndexOutOfBoundsExceptionlugar de OOMcuando hay mucha memoria disponible. Esto se debe a que Java usa el tipo de 32 bits intpara indexar matrices (y las cadenas son solo matrices de char). Esto no afecta a la x+=x.intern()solución ya que la memoria requerida para este último es cuadrática en la longitud de la cadena, y por lo tanto debería escalar hasta el orden de 2 ^ 62 bytes asignados.