On 2020-03-09 21:37, Kim Barrett wrote:
On Mar 9, 2020, at 4:30 AM, Magnus Ihse Bursie <[email protected]> wrote:

When reworking the JVM feature handling, I wanted to try to compile Hotspot 
with various features enabled/disabled. I quickly found out that it's not 
really possible to build hotspot without the serial gc. While this is not a 
terribly important use case, I think it's good to be able to select serial 
freely, just as with the other collectors.

With this patch it is possible to build a truly minimal JVM using 'configure 
--with-jvm-variants=custom --with-jvm-features=g1gc'.

Bug: https://bugs.openjdk.java.net/browse/JDK-8240224
WebRev: 
http://cr.openjdk.java.net/~ihse/JDK-8240224-building-without-serial-gc/webrev.01

/Magnus
I'm inclined to agree with David and Aleksey that this isn't really a
worthwhile exercise. Especially not if it involves making some
otherwise questionable or controversial changes.

As I've said in the previous comments, it's not so much about making Hotspot running without Serial GC as making configure live up to it's promise not to create an un-buildable configuration. I apologize if my changes are questionable or controversial -- my assessment was on the contrary that they were simple and non-obtrusive, to the point of triviality.


In addition to the issues mentioned by David and Aleksey:

------------------------------------------------------------------------------
src/hotspot/share/gc/shared/gcConfig.cpp

I would instead suggest there should not be a default at all instead
of adding these cases, and the user must explicitly select the GC to
be used. Since we're talking about an atypical custom build anyway,
the user presumably knows what they are doing. And yeah, that makes
the buildjdk stuff elsewhere in this patch harder.

If you build without the Serial GC, it is not even possible to start the JVM without a flag selecting GC. Instead you get a somewhat cryptic (and incorrect) message about missing garbage collectors. Even if the end user would be able to know that you need to pass an additional option just to be able to start java, the build system knows no such thing, so we cannot even finish the build -- as soon as we try to use the newly built JVM (e.g. for running jlink), we will crash and burn.

Really, I think this ought to just be left alone, along with most of
the other build-specific changes.

[This also responds to / agrees with Aleksey's comment about this part.]

------------------------------------------------------------------------------
src/hotspot/share/gc/shared/genCollectedHeap.cpp
  197 #if INCLUDE_SERIALGC
  198   MarkSweep::initialize();
  199 #endif

This whole file, and several associated files, are *only* used by
SerialGC now that CMS has been removed: JDK-8234502.

Then maybe they should be excluded when serial is not included? Or, if it is determined that Serial GC is essential to hotspot, we should remove the INCLUDE_SERIALGC define and associated framework, since it's just a fake abstraction if it is not actually possible to build without serial GC.


------------------------------------------------------------------------------
make/hotspot/lib/JvmFeatures.gmk
   58 ifeq ($(JVM_VARIANT), custom)
   59   JVM_CFLAGS_FEATURES += -DVMTYPE=\"Custom\"
   60 endif

This change looks unrelated to whether serialgc is present or absent.
If so, it doesn't belong in this changeset at all.

You are correct that this is not strictly about serialgc. When I tested my custom build with only epsilongc, I discovered that jtreg barfed on the version string produced by the custom JVM build. This is a fix that makes sure the VMTYPE always has a value. If you object to me pushing it as part of this fix, I can remove it from here and submit it as a separate issue. (I just didn't think it was worth the hassle.)


------------------------------------------------------------------------------
make/hotspot/lib/JvmFeatures.gmk
[removed]
  154   # If serial is disabled, we cannot use serial as OldGC in parallel
  155   JVM_EXCLUDE_FILES += psMarkSweep.cpp psMarkSweepDecorator.cpp

This was missed by JDK-8235860, which removed those files.  Good find.
... but according to your comment above, that fix also missed to add a bunch of other files that should be excluded..? (If we should keep the ability to disable serial gc, that is...)

------------------------------------------------------------------------------
test/hotspot/gtest/gc/shared/test_collectorPolicy.cpp

As originally written, this test was *only* testing SerialGC. It's not
obvious that it is actually GC-agnostic and can use the default GC if
that isn't SerialGC.  Certainly some of the naming suggests otherwise.
Was this tested with all the other configurations?

No, I have not tested all other configurations. I verified that I could build with only g1, only zgc and only epsilongc. I also tested to run tier1 testing, and it "mostly" succeeded, but it still failed on several tests. My quick eyeballing of the situation indicated that the absolute majority (and perhaps all) these failures were related to jtreg tests not properly declaring their dependencies on compiler1 or compiler2. (Remember, on this bare-bones JVM I only had the interpreter, and neither c1 nor c2).

I *could* of course run a suitable set of testing with say c1 and c2 enabled, and just a single gc enabled, for the set of all gcs != serial gc, but then we're *really* getting into the "not worth it" land.

It is not clear to me that the test is only run with Serial GC. As far as I can interpret the test framework, this is run with the default collector, which typically is *not* serialgc on our testing framework. If this is only valid for Serial GC, perhaps the test needs to be amended?

/Magnus


------------------------------------------------------------------------------


Reply via email to