Tencent/matrix · error · IllegalArgumentException
Unsupported object type $value
Error message
Unsupported object type $value
What it means
MemoryUtil.convertObjectType maps numeric object-type codes from leak-chain nodes to ReferenceTraceElement.Holder. Values other than 1 (CLASS), 2 (ARRAY), or 3 (OBJECT) throw IllegalArgumentException('Unsupported object type $value'), signaling unknown or corrupted dump data.
Solutions
- Upgrade Matrix to a version whose parser matches your device's dump format.
- Re-dump the hprof from a supported device and retry.
- Skip/discard corrupted chains defensively with try-catch around parsing.
- Check that the chain data was produced by the same Matrix version that parses it (no cross-version file exchange).
Example fix
// before
val chain = MemoryUtil.parseLeakChain(legacyChainFile) // foreign format
// after
try {
val chain = MemoryUtil.parseLeakChain(legacyChainFile)
} catch (e: IllegalArgumentException) {
MatrixLog.e(TAG, "unsupported object type, dropping chain")
legacyChainFile.delete()
} Defensive patterns
Strategy: try-catch
Validate before calling
fun isKnownObjectType(v: Int) = v in 1..3
Type guard
fun Int.asHolder(): ReferenceTraceElement.Holder? = when (this) {
1 -> ReferenceTraceElement.Holder.CLASS
2 -> ReferenceTraceElement.Holder.ARRAY
3 -> ReferenceTraceElement.Holder.OBJECT
else -> null
} Try / catch
try {
val chain = MemoryUtil.parseLeakChain(file)
} catch (e: IllegalArgumentException) {
MatrixLog.e(TAG, "unsupported object type, dropping chain: ${e.message}")
} Prevention
- Regenerate dumps when Matrix or OS versions change instead of reusing old chain files.
- Validate chain node fields before deep parsing.
- Isolate parsing in a worker with graceful failure handling so one bad chain doesn't crash the analysis.
When it happens
Trigger: Parsing a leak chain whose node.objectType is not 1, 2, or 3 — from malformed, truncated, or newer-format hprof-derived chain files.
Common situations: Feeding hprof dumps from unsupported ART/OS versions into the analyzer; corrupted dumps after low-memory kills; data produced by incompatible tooling versions.
Related errors
- Unsupported reference type $value
- Unabled to find destroy activity info class with name:
- Could not find weak reference with key
- free space($freeSpace) less than $CLEAN_THRESHOLD, skip…
- closer == null
AI-assisted analysis of Tencent/matrix@3b8293bd65 (2026-09-08).
Data as JSON: /api/errors/bf3dbbdd5735ed2d.
Report an issue: GitHub.
Appendix: source
Thrown at matrix/matrix-android/matrix-resource-canary/matrix-resource-canary-android/src/main/java/com/tencent/matrix/resource/MemoryUtil.kt:284
}
}
private fun convertReferenceType(value: Int): ReferenceTraceElement.Type =
when (value) {
// It is an end-tag that can only be the last chain element reference type.
0 -> ReferenceTraceElement.Type.INSTANCE_FIELD
1 -> ReferenceTraceElement.Type.STATIC_FIELD
2 -> ReferenceTraceElement.Type.INSTANCE_FIELD
3 -> ReferenceTraceElement.Type.ARRAY_ENTRY
else -> throw IllegalArgumentException("Unsupported reference type $value")
}
private fun convertObjectType(value: Int): ReferenceTraceElement.Holder =
when (value) {
1 -> ReferenceTraceElement.Holder.CLASS
2 -> ReferenceTraceElement.Holder.ARRAY
3 -> ReferenceTraceElement.Holder.OBJECT
else -> throw IllegalArgumentException("Unsupported object type $value")
}
private data class LeakChain(val nodes: List<Node>) {
data class Node(
val objectName: String,
val objectType: Int,
val referenceName: String,
val referenceType: Int
)
fun convertToReferenceChain(): ReferenceChain =
nodes.map {
ReferenceTraceElement(
it.referenceName,
convertReferenceType(it.referenceType),
convertObjectType(it.objectType),
it.objectName,
null, null, emptyList()View on GitHub (pinned to 3b8293bd65)