android / nowinandroid

A fully functional Android app built entirely with Kotlin and Jetpack Compose
Apache License 2.0
16.61k stars 3.01k forks source link

[FR]: Faster build speed with Gradle properties + jemalloc #1510

Open kaeawc opened 3 months ago

kaeawc commented 3 months ago

Is there an existing issue for this?

Describe the problem

I was talking about the settings used in this project with @liutikas and some others. It was speculated that it was possible to reduce the JVM heap size the project uses and also attain a faster build speed.

Describe the solution

I propose we do this by:

Additional context

I already did the performance testing and changes, I'm just filling this out so the change can be considered and reviewed.

Code of Conduct

Hackermrj commented 3 months ago

Is there an existing issue for this?

  • [x] I have searched the existing issues

Describe the problem

I was talking about the settings used in this project with @liutikas and some others. It was speculated that it was possible to reduce the JVM heap size the project uses and also attain a faster build speed.

Describe the solution

I propose we do this by:

  • Using jemalloc as a malloc replacement - most projects get about 10% memory freed up, though no build speed impact
  • Use G1GC - I've seen this work better for Android projects that use JDK 19 or later, or if they're simply having some memory contention/pressure issues with running the project on resource constrained machines.
  • SoftRefLRUPolicy - This is defaulted to 1000 which at current settings would take almost 2 hours to release any soft ref
  • ReservedCodeCacheSize - Increasing this from the default allows the project to preallocate the codecache and not have to spend time growing it during a build
  • MetaspaceSize - From my research about Metaspace, Android Gradle builds benefit the most when MaxMetaspace is allowed to be unlimited (the JVM default) and MetaspaceSize set to 512MB or 1GB instead of the default 20MB. This is because MaxMetaspace is a constraint on both Metapsace and ClassPointers, the latter of which defaults to 1GB.
  • Min & max heap - Experimentation required to see what the optimal heap size for the project would be for both local development and GitHub CI.

Additional context

I already did the performance testing and changes, I'm just filling this out so the change can be considered and reviewed.

Code of Conduct

  • [x] I agree to follow this project's Code of Conduct

Yep sure Mr.kaeawc I'm clear this issue as you soon. Thank you for your information