Java, 451450 + 2122 = 472 bytes source, ~1GB class file
The source file contains an UTF-8 character! Use the correct encoding when saving the file.
import javax.annotation.processing.*;@SupportedAnnotationTypes("java.lang.Override")public class B extends AbstractProcessor{@Override public boolean process(java.util.Set a,RoundEnvironment r){if(a.size()>0){try(java.io.Writer w=processingEnv.getFiler().createSourceFile("C").openWriter()){w.write("class C{int ");for(int i=0;i<16460;++ii=0;i<16380;++i){for(int j=0;j<16300;++jj=0;j<65500;++j){w.write("ä""i");}w.write(i+";int ");}w.write("i;}");}catch(Exception e){}}return true;}} import java.io.Writer; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import javax.lang.model.element.TypeElement; @SupportedAnnotationTypes("java.lang.Override") @SupportedSourceVersion(SourceVersion.RELEASE_8) public class B extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if (annotations.size() > 0) { try (Writer writer = processingEnv.getFiler().createSourceFile("C").openWriter()) { writer.write("class C{int "); for (int i = 0; i < 16460;16380; ++i) { for (int j = 0; j < 16300;65500; ++j) { writer.write("ä""i"); } writer.write(i + ";int "); } writer.write("i;}"); } catch (Exception e) { } } return true; } } javac B.java javac -J-Xmx9GXmx16G -processor B B.java This bomb uses Annotation Processors. It needs 2 compile passes. The first pass builds the processor class B. During the second pass the processor creates a new source file C.java, and compiles it to a C.class with a size of 1,073,444141,442162 bytes.
CreatingThere are several limitations when trying to create a biggerbig class file should be possible, but there seems to be a bug in javac. If I increase 16460 to 16470 the compiler never returns (probably some endless loop because of output exceeding 1GB).:
- Creating identifiers longer than about 64k results in:
error: UTF8 representation for string "iiiiiiiiiiiiiiiiiiii..." is too long for the constant pool. - Creating more than about 64k variables/functions results in:
error: too many constants - There is also a limit of about 64k for the code size of a function.
- There seems to be a general limit (bug?) in the java compiler of about 1GB for the
.classfile. If I increase16380to16390in the above code the compiler never returns. - There is also a limit of about 1GB for the
.javafile. Increasing16380to16400in the above code results in:An exception has occurred in the compiler (1.8.0_66). Please file a bug ...followed by ajava.lang.IllegalArgumentException.