CARVIEW |
Select Language
HTTP/2 200
date: Mon, 21 Jul 2025 12:23:36 GMT
content-type: text/html; charset=utf-8
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With,Accept-Encoding, Accept, X-Requested-With
x-robots-tag: none
etag: W/"d72dec8a7f890aa5ad8d16c921755880"
cache-control: max-age=0, private, must-revalidate
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: no-referrer-when-downgrade
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=bQ9DQ2Qs2RfCCOkfFDP%2BItP83%2BXeUusdiNsXw8O8%2B7yXtSDwYrVEvPnwpVSKp7nRlSWsWmIeghMbJNUQAvHHZeeF178OBTu0E2fclu26ZEbcwWRFxKzTA6U2Z1Hd0a8OamEqwFaKcNFniafq59nKWfW6x32STOr1ZU2ZcGC6mfnRcug6DFcQkO1oAVnqYBnKEZ1oZQ5vBvpy%2BiztyppXNP2wiE0DwwzkDwt5hNiUtmUtra2seH4sAwSTAjj5iPLWETKGTnhse7cj3vAGvnnBOA%3D%3D--%2B7RZpqWsFS%2BfKTda--TYodKO4z4V4r8Uj4LQDqGQ%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.154782463.1753100616; Path=/; Domain=github.com; Expires=Tue, 21 Jul 2026 12:23:36 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Tue, 21 Jul 2026 12:23:36 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: CBCE:0A65:1761F62:1D22ABE:687E3148
How fast is ClassGraph · classgraph/classgraph Wiki · GitHub
Skip to content
Navigation Menu
{{ message }}
-
-
Notifications
You must be signed in to change notification settings - Fork 294
How fast is ClassGraph
Luke Hutchison edited this page Jun 12, 2020
·
2 revisions
ClassGraph is the fastest classpath and module scanning mechanism:
- ClassGraph parses the classfile binary format directly to determine the class graph. This is significantly faster than reflection-based methods, because no classloading needs to be performed to determine how classes are related, and additionally, class static initializer blocks are not called (which can be time consuming, and can trigger side effects).
- ClassGraph implements its own highly-optimized bytecode parser, and does not depend upon large, abstract bytecode parsing libraries like ObjectWeb ASM. In fact, ClassGraph does not have any dependencies at all.
- ClassGraph also implements its own highly-optimized zipfile central directory parser, which is capable of handling jarfiles nested within jarfiles, to arbitrary nesting depth, without first extracting the inner jarfile (as long as the inner jarfile is stored rather than deflated). (The Java
ZipFile
API is not capable of this.) - ClassGraph has been carefully profiled, tuned and parallelized so that multiple threads are concurrently engaged in reading from disk/SSD, decompressing jarfiles, and parsing classfiles. Consequently, ClassGraph runs at close to the theoretical maximum possible speed for a classpath scanner, and scanning speed is primarily limited by raw filesystem bandwidth.
- Wherever possible, lock-free datastructures are used to eliminate thread contention, and shared caches are used to avoid duplicating work. Recyclers are used to avoid allocating more objects than necessary, and to avoid repeating the overhead of opening jarfiles and modules.
- ClassGraph includes comprehensive mechanisms for accepting and rejecting, so that only the necessary resources are scanned.
- ClassGraph has several different mechanisms for opening files on disk (including
FileInputStream
and memory-mapped NIOFileChannel
), switching automatically between them according to OS-specific tuning and benchmarking, depending on the filesize. This gives the fastest possible mechanism for scanning classfiles in directories, jars, and modules. ClassGlaph also only reads as many bytes as necessary from a classfile to get the required class metadata.
ClassGraph is typically several times faster at scanning large classpaths consisting of many directories or jarfiles than the widely-used library Reflections. If ClassGraph is slower than Reflections for your usecase, that is because it has discovered a larger set of classpath elements to scan than Reflections. You can limit what is scanned using accept / reject criteria (see the wiki for more info).
You can’t perform that action at this time.