Currently, the -server compiler doesn't use CDS (Class Data Sharing) because with CDS, -XX:+RewriteBytecodes is turned off. This RewriteBytecodes optimization modifies bytecodes while the interpreter is running so that the second invocation can use information from the resolution and not resolve the bytecode again. This is done for the bytecodes _getfield, _putfield. If the bytecodes in the Method* are modified, then it can't be shared in the Read only section of the CDS archive.
This optimization is worth ~10% interpreter speedup. With -server, the interpreter runs for more invocation counts than the -client compiler, so the interpreter speedup costs ~2% on some applications. Therefore, the default mode for -server is to turn off CDS.
There are a couple ways to fix it. One is detect that a class is in the CDS archive and not perform the bytecode rewriting for that method. The other is to rewrite the bytecodes in question with their type information in the rewriter (before the interpreter runs) while the class is being linked. The rewriting that happens in the rewriter is saved in the CDS archive.
There are two things that the bytecode rewriting does during interpretation. One is to check if it's resolved in the cpCache and the other is to add the type: ie _putfield becomes _fast_{iasbl}putfield. From measurements a long time ago, the rewriting to add the type was the most valuable of this optimization. Maybe this can be determined earlier during linktime rewriting.
There are other interpreter optimizations like RewriteFrequentPairs that I don't think are that valuable to performance.
This is marked as hs25 because permgen elimination makes CDS work with all collectors so it's worth making the server compiler perform better with CDS.