Skip to content

jvm crash when field type changed #663

Closed
@HiwayChe

Description

@HiwayChe

JavaBean:

public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
//getter, setter
}

SerializeUtil:

  static Pool<Kryo> kryoPool = new Pool<Kryo>(true, false, 100) {
    @Override
    protected Kryo create() {
        Kryo kryo = new Kryo();
        UnmodifiableCollectionsSerializer.registerSerializers(kryo);
        kryo.setInstantiatorStrategy(new DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
        kryo.setReferences(false);
        kryo.setRegistrationRequired(false);
        kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
        return kryo;
    }
};

serialize a person object to file, note that id field is now String type, after then change id to Long type, deserialize from file to a Person object, it succeed, and you can see a String value hacker was assigned to a Long field in the below picture(Line 74),
image

when code execute to line 77, jvm crashed, maybe I should not change id type from String to Long, but if kryo throws exception instead of crashing jvm will be more elegant.

Env:jdk8, kryo 5.0.0-RC1, kryo-serializers 0.45(I think this issue has nothing to do with kryo-serializers)

Activity

isaki

isaki commented on Mar 24, 2019

@isaki
Contributor

I've never seen the JVM crash for improper payloads; normally I get a KryoException (which is an unchecked exception) under Kryo 4.0.2. Do you have a stack trace for the crash?

HiwayChe

HiwayChe commented on Mar 25, 2019

@HiwayChe
Author

I've never seen the JVM crash for improper payloads; normally I get a KryoException (which is an unchecked exception) under Kryo 4.0.2. Do you have a stack trace for the crash?

I'll try Kryo 4.0.2 and watch the result, also provide reproduction code and jvm crash report later this afternoon.

HiwayChe

HiwayChe commented on Mar 25, 2019

@HiwayChe
Author

I've never seen the JVM crash for improper payloads; normally I get a KryoException (which is an unchecked exception) under Kryo 4.0.2. Do you have a stack trace for the crash?

https://github.com/HiwayChe/kryotest
I have uploaded reproduction code in github, you can run Main.testKryo5 to reproduce the issue, and I write reproduction instruction in code comment.
Jdk:Hotspot 1.8.0

isaki

isaki commented on Mar 25, 2019

@isaki
Contributor

Well that's.... alarming. Your code and instructions were spot on. I'm able to reproduce (with a few minor changes) on MacOS under Oracle JDK 8u201. I'll put together a build under OpenJDK and test there as well to see if I get the same crash.

I'll also look into your notes about Kryo4 and respond back here.

isaki

isaki commented on Mar 25, 2019

@isaki
Contributor

Arch Linux (64 bit), OpenJDK-8u212 (changes included the file path moving from D: to /tmp and changing the POM to use a shaded JAR so that I had a complete class path and a main class in the manifest).

~/tmp $ java -jar s/kryo-test-1.0-SNAPSHOT.jar 
~/tmp $ ls -l /tmp/person.ser 
-rw-r--r-- 1 isaki isaki 38 Mar 25 11:31 /tmp/person.ser
~/tmp $ java -jar d/kryo-test-1.0-SNAPSHOT.jar 
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fbdc8a18496, pid=1373, tid=0x00007fbdc812a700
#
# JRE version: OpenJDK Runtime Environment (8.0_212-b01) (build 1.8.0_212-b01)
# Java VM: OpenJDK 64-Bit Server VM (25.212-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.so+0x768496]
#
# Core dump written. Default location: /home/isaki/tmp/core or core.1373
#
# An error report file with more information is saved as:
# /home/isaki/tmp/hs_err_pid1373.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
Aborted (core dumped)
~/tmp $ 
isaki

isaki commented on Mar 25, 2019

@isaki
Contributor

Stack Info from Linux crash:

Stack: [0x00007fbdc802b000,0x00007fbdc812b000],  sp=0x00007fbdc81295b0,  free space=1017k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x768496]
V  [libjvm.so+0x76aed5]
V  [libjvm.so+0x7711c6]
V  [libjvm.so+0x64413e]
j  com.hiway.kryo.test.Main.testKryo5(Ljava/io/File;)V+23
j  com.hiway.kryo.test.Main.main([Ljava/lang/String;)V+20
v  ~StubRoutines::call_stub
V  [libjvm.so+0x64bd77]
V  [libjvm.so+0x66a557]
V  [libjvm.so+0x66c9c6]
C  [libjli.so+0x2da1]
C  [libpthread.so.0+0x7a9d]  start_thread+0xfd

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  com.hiway.kryo.test.Main.testKryo5(Ljava/io/File;)V+23
j  com.hiway.kryo.test.Main.main([Ljava/lang/String;)V+20
v  ~StubRoutines::call_stub

Process Info (Not all of it, just the interesting parts):

---------------  P R O C E S S  ---------------

Java Threads: ( => current thread )
  0x00007fbdc414b000 JavaThread "Service Thread" daemon [_thread_blocked, id=1383, stack(0x00007fbdb10d2000,0x00007fbdb11d3000)]
  0x00007fbdc413e000 JavaThread "C1 CompilerThread1" daemon [_thread_blocked, id=1382, stack(0x00007fbdb11d4000,0x00007fbdb12d4000)]
  0x00007fbdc413b800 JavaThread "C2 CompilerThread0" daemon [_thread_blocked, id=1381, stack(0x00007fbdb12d5000,0x00007fbdb13d5000)]
  0x00007fbdc413a000 JavaThread "Signal Dispatcher" daemon [_thread_blocked, id=1380, stack(0x00007fbdb13d5000,0x00007fbdb14d6000)]
  0x00007fbdc4106800 JavaThread "Finalizer" daemon [_thread_blocked, id=1379, stack(0x00007fbdb17bb000,0x00007fbdb18bc000)]
  0x00007fbdc4104000 JavaThread "Reference Handler" daemon [_thread_blocked, id=1378, stack(0x00007fbdb18bc000,0x00007fbdb19bd000)]
=>0x00007fbdc400a800 JavaThread "main" [_thread_in_vm, id=1374, stack(0x00007fbdc802b000,0x00007fbdc812b000)]

Other Threads:
  0x00007fbdc40fa800 VMThread [stack: 0x00007fbdb19be000,0x00007fbdb1abe000] [id=1377]
  0x00007fbdc414d800 WatcherThread [stack: 0x00007fbdb0fd2000,0x00007fbdb10d2000] [id=1384]

VM state:not at safepoint (normal execution)

VM Mutex/Monitor currently owned by a thread: None

heap address: 0x00000000d1600000, size: 746 MB, Compressed Oops mode: 32-bit
Narrow klass base: 0x0000000000000000, Narrow klass shift: 3
Compressed class space size: 1073741824 Address: 0x0000000100000000

Heap:
 PSYoungGen      total 14336K, used 5558K [0x00000000f0780000, 0x00000000f1780000, 0x0000000100000000)
  eden space 12288K, 45% used [0x00000000f0780000,0x00000000f0cedbe8,0x00000000f1380000)
  from space 2048K, 0% used [0x00000000f1580000,0x00000000f1580000,0x00000000f1780000)
  to   space 2048K, 0% used [0x00000000f1380000,0x00000000f1380000,0x00000000f1580000)
 ParOldGen       total 32768K, used 0K [0x00000000d1600000, 0x00000000d3600000, 0x00000000f0780000)
  object space 32768K, 0% used [0x00000000d1600000,0x00000000d1600000,0x00000000d3600000)
 Metaspace       used 5618K, capacity 5788K, committed 5888K, reserved 1056768K
  class space    used 607K, capacity 676K, committed 768K, reserved 1048576K

Card table byte_map: [0x00007fbdb4a85000,0x00007fbdb4bfb000] byte_map_base: 0x00007fbdb43fa000

Marking Bits: (ParMarkBitMap*) 0x00007fbdc8f85c80
 Begin Bits: [0x00007fbdb303a000, 0x00007fbdb3be2000)
 End Bits:   [0x00007fbdb3be2000, 0x00007fbdb478a000)

Polling page: 0x00007fbdc93a9000

CodeCache: size=245760Kb used=1668Kb max_used=1668Kb free=244091Kb
 bounds [0x00007fbdb4fbb000, 0x00007fbdb522b000, 0x00007fbdc3fbb000]
 total_blobs=594 nmethods=306 adapters=203
 compilation: enabled

Compilation events (10 events):
Event: 0.142 Thread 0x00007fbdc413e000  299       1       sun.misc.URLClassPath$JarLoader::access$600 (5 bytes)
Event: 0.142 Thread 0x00007fbdc413e000 nmethod 299 0x00007fbdb515be50 code [0x00007fbdb515bfa0, 0x00007fbdb515c090]
Event: 0.142 Thread 0x00007fbdc413e000  300       1       java.util.jar.Manifest::getMainAttributes (5 bytes)
Event: 0.142 Thread 0x00007fbdc413e000 nmethod 300 0x00007fbdb515c110 code [0x00007fbdb515c260, 0x00007fbdb515c370]
Event: 0.142 Thread 0x00007fbdc413e000  303       1       sun.misc.URLClassPath$Loader::getBaseURL (5 bytes)
Event: 0.142 Thread 0x00007fbdc413e000 nmethod 303 0x00007fbdb515c3d0 code [0x00007fbdb515c520, 0x00007fbdb515c630]
Event: 0.142 Thread 0x00007fbdc413e000  304       1       java.util.jar.Manifest::getEntries (5 bytes)
Event: 0.142 Thread 0x00007fbdc413e000 nmethod 304 0x00007fbdb515c690 code [0x00007fbdb515c7e0, 0x00007fbdb515c8f0]
Event: 0.142 Thread 0x00007fbdc413e000  305       1       java.util.jar.JarFile::access$300 (5 bytes)
Event: 0.142 Thread 0x00007fbdc413e000 nmethod 305 0x00007fbdb515c950 code [0x00007fbdb515caa0, 0x00007fbdb515cb90]

GC Heap History (0 events):
No events

Deoptimization events (1 events):
Event: 0.088 Thread 0x00007fbdc400a800 Uncommon trap: reason=unstable_if action=reinterpret pc=0x00007fbdb50f9f04 method=java.lang.String.indexOf(II)I @ 49

Classes redefined (0 events):
No events

Internal exceptions (5 events):
Event: 0.015 Thread 0x00007fbdc400a800 Exception <a 'java/lang/NoSuchMethodError': Method sun.misc.Unsafe.defineClass(Ljava/lang/String;[BII)Ljava/lang/Class; name or signature does not match> (0x00000000f0787cb0) thrown at [/build/java8-openjdk/src/jdk8u-jdk8u212-b01/hotspot/src/share/vm/prim
Event: 0.015 Thread 0x00007fbdc400a800 Exception <a 'java/lang/NoSuchMethodError': Method sun.misc.Unsafe.prefetchRead(Ljava/lang/Object;J)V name or signature does not match> (0x00000000f0787f98) thrown at [/build/java8-openjdk/src/jdk8u-jdk8u212-b01/hotspot/src/share/vm/prims/jni.cpp, line 40
Event: 0.109 Thread 0x00007fbdc400a800 Exception <a 'java/lang/NoSuchFieldError': method resolution failed> (0x00000000f0aae020) thrown at [/build/java8-openjdk/src/jdk8u-jdk8u212-b01/hotspot/src/share/vm/prims/methodHandles.cpp, line 1167]
Event: 0.110 Thread 0x00007fbdc400a800 Exception <a 'java/lang/NoSuchFieldError': method resolution failed> (0x00000000f0abb820) thrown at [/build/java8-openjdk/src/jdk8u-jdk8u212-b01/hotspot/src/share/vm/prims/methodHandles.cpp, line 1167]
Event: 0.137 Thread 0x00007fbdc400a800 Exception <a 'java/lang/ArrayIndexOutOfBoundsException': 18> (0x00000000f0bdc760) thrown at [/build/java8-openjdk/src/jdk8u-jdk8u212-b01/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp, line 368]

Events (10 events):
Event: 0.152 loading class java/lang/AssertionStatusDirectives
Event: 0.152 loading class java/lang/AssertionStatusDirectives done
Event: 0.152 loading class sun/reflect/NativeMethodAccessorImpl
Event: 0.152 loading class sun/reflect/NativeMethodAccessorImpl done
Event: 0.152 loading class sun/reflect/DelegatingMethodAccessorImpl
Event: 0.152 loading class sun/reflect/DelegatingMethodAccessorImpl done
Event: 0.153 loading class com/esotericsoftware/reflectasm/PublicConstructorAccess
Event: 0.153 loading class com/esotericsoftware/reflectasm/PublicConstructorAccess done
Event: 0.153 loading class com/esotericsoftware/kryo/util/DefaultInstantiatorStrategy$1
Event: 0.153 loading class com/esotericsoftware/kryo/util/DefaultInstantiatorStrategy$1 done

I can share the entire crash dump if needed.

isaki

isaki commented on Mar 25, 2019

@isaki
Contributor

If you remove the CompatibleFieldSerializer declaration under Kryo 5, you get the "-48" answer, which is really, really strange (I'd have expected a KryoException be thrown here).

isaki

isaki commented on Mar 25, 2019

@isaki
Contributor

4.0.2:

I get "-48" for both the default field serializer and compatible field serializer (though if I use the file generate by the compatible field serializer with the default, you get "-52"). This is with Asm enablement both true and false (consistent results).

For some reason, "hacker" is being converted to a Long of -49. I created a really long string and ended up with -1 (printing 0 due to the +1L in the test code).

00:00 TRACE: [kryo] Read class name: com.hiway.kryo.test.Person
00:00 TRACE: [kryo] Optimize ints: true
00:00 TRACE: [kryo] Field id: class java.lang.Long
00:00 TRACE: [kryo] Register class name: com.hiway.kryo.test.Person (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] Read field: id (com.hiway.kryo.test.Person) pos=28
00:00 TRACE: [kryo] Read: -1
00:00 DEBUG: [kryo] Read: com.hiway.kryo.test.Person
00:00 TRACE: [kryo] Object graph complete.
0
isaki

isaki commented on Mar 25, 2019

@isaki
Contributor

Here is the Kryo5 trace log for the crash (compatible field serializer in use):

00:00 TRACE: [kryo] Register class ID 0: int (com.esotericsoftware.kryo.serializers.DefaultSerializers$IntSerializer)
00:00 TRACE: [kryo] Register class ID 1: String (com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer)
00:00 TRACE: [kryo] Register class ID 2: float (com.esotericsoftware.kryo.serializers.DefaultSerializers$FloatSerializer)
00:00 TRACE: [kryo] Register class ID 3: boolean (com.esotericsoftware.kryo.serializers.DefaultSerializers$BooleanSerializer)
00:00 TRACE: [kryo] Register class ID 4: byte (com.esotericsoftware.kryo.serializers.DefaultSerializers$ByteSerializer)
00:00 TRACE: [kryo] Register class ID 5: char (com.esotericsoftware.kryo.serializers.DefaultSerializers$CharSerializer)
00:00 TRACE: [kryo] Register class ID 6: short (com.esotericsoftware.kryo.serializers.DefaultSerializers$ShortSerializer)
00:00 TRACE: [kryo] Register class ID 7: long (com.esotericsoftware.kryo.serializers.DefaultSerializers$LongSerializer)
00:00 TRACE: [kryo] Register class ID 8: double (com.esotericsoftware.kryo.serializers.DefaultSerializers$DoubleSerializer)
00:00 TRACE: [kryo] References: false
00:00 TRACE: [kryo] Registration required: false
00:00 TRACE: [kryo] Read class name: com.hiway.kryo.test.Person [28]
00:00 TRACE: [kryo] Cached Long field: id (com.hiway.kryo.test.Person)
00:00 TRACE: [kryo] Register class name: com.hiway.kryo.test.Person (com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer)
00:00 TRACE: [kryo] Read fields for class: com.hiway.kryo.test.Person
00:00 TRACE: [kryo] Read field name: id
00:00 TRACE: [kryo] Read class 1: String [32]
00:00 TRACE: [kryo] Read field String: id (com.hiway.kryo.test.Person) [32]
00:00 TRACE: [kryo] Read: hacker (String) [38]
00:00 DEBUG: [kryo] Read: com.hiway.kryo.test.Person [38]
00:00 TRACE: [kryo] Object graph complete.
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000010fdd0089, pid=13334, tid=0x0000000000002603
#
# JRE version: Java(TM) SE Runtime Environment (8.0_201-b09) (build 1.8.0_201-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.201-b09 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x3d0089]
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/isaki/git/kryotest/hs_err_pid13334.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#
isaki

isaki commented on Apr 7, 2019

@isaki
Contributor

I have not had time to dig into this any deeper; I have not forgotten about it.

isaki

isaki commented on Apr 16, 2019

@isaki
Contributor

I have a working fix. However, there are other things about the way this happens outside of compatible field serializer that bother me and I want to see if I can clean up.

Sample output/exception:

00:00 TRACE: [kryo] Register class ID 0: int (com.esotericsoftware.kryo.serializers.DefaultSerializers$IntSerializer)
00:00 TRACE: [kryo] Register class ID 1: String (com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer)
00:00 TRACE: [kryo] Register class ID 2: float (com.esotericsoftware.kryo.serializers.DefaultSerializers$FloatSerializer)
00:00 TRACE: [kryo] Register class ID 3: boolean (com.esotericsoftware.kryo.serializers.DefaultSerializers$BooleanSerializer)
00:00 TRACE: [kryo] Register class ID 4: byte (com.esotericsoftware.kryo.serializers.DefaultSerializers$ByteSerializer)
00:00 TRACE: [kryo] Register class ID 5: char (com.esotericsoftware.kryo.serializers.DefaultSerializers$CharSerializer)
00:00 TRACE: [kryo] Register class ID 6: short (com.esotericsoftware.kryo.serializers.DefaultSerializers$ShortSerializer)
00:00 TRACE: [kryo] Register class ID 7: long (com.esotericsoftware.kryo.serializers.DefaultSerializers$LongSerializer)
00:00 TRACE: [kryo] Register class ID 8: double (com.esotericsoftware.kryo.serializers.DefaultSerializers$DoubleSerializer)
00:00 TRACE: [kryo] Registration required: false
00:00 TRACE: [kryo] Read class name: com.hiway.kryo.test.Person [28]
00:00 TRACE: [kryo] Cached Long field: id (com.hiway.kryo.test.Person)
00:00 TRACE: [kryo] Register class name: com.hiway.kryo.test.Person (com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer)
00:00 TRACE: [kryo] Read fields for class: com.hiway.kryo.test.Person
00:00 TRACE: [kryo] Read field name: id
00:00 TRACE: [kryo] Read class 1: String [32]
00:00 TRACE: [kryo] Object graph complete.
Exception in thread "main" com.esotericsoftware.kryo.KryoException: String found in data where Long found in bytecode
	at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:163)
	at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:799)
	at com.hiway.kryo.test.Main.deserialize(Main.java:98)
	at com.hiway.kryo.test.Main.testKryo5(Main.java:71)
	at com.hiway.kryo.test.Main.main(Main.java:31)

EDIT: I think throwing here is wrong; I'm going to see if I can play nice and just log the issue.
EDIT 2: Throwing is right, but only if chunked is disabled. I'm happy with what I have. Will update once I've dealt with FieldSerializer accessing memory it shouldn't (but doesn't SIGSEGV).

isaki

isaki commented on Apr 17, 2019

@isaki
Contributor

For normal field serializer, you get a corrupt stream if you change the type when you have additional fields in the object. This is acceptable. I'll submit my fix for compatible mode.

00:00 TRACE: [kryo] Register class ID 0: int (com.esotericsoftware.kryo.serializers.DefaultSerializers$IntSerializer)
00:00 TRACE: [kryo] Register class ID 1: String (com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer)
00:00 TRACE: [kryo] Register class ID 2: float (com.esotericsoftware.kryo.serializers.DefaultSerializers$FloatSerializer)
00:00 TRACE: [kryo] Register class ID 3: boolean (com.esotericsoftware.kryo.serializers.DefaultSerializers$BooleanSerializer)
00:00 TRACE: [kryo] Register class ID 4: byte (com.esotericsoftware.kryo.serializers.DefaultSerializers$ByteSerializer)
00:00 TRACE: [kryo] Register class ID 5: char (com.esotericsoftware.kryo.serializers.DefaultSerializers$CharSerializer)
00:00 TRACE: [kryo] Register class ID 6: short (com.esotericsoftware.kryo.serializers.DefaultSerializers$ShortSerializer)
00:00 TRACE: [kryo] Register class ID 7: long (com.esotericsoftware.kryo.serializers.DefaultSerializers$LongSerializer)
00:00 TRACE: [kryo] Register class ID 8: double (com.esotericsoftware.kryo.serializers.DefaultSerializers$DoubleSerializer)
00:00 TRACE: [kryo] Registration required: false
00:00 TRACE: [kryo] Read class name: com.hiway.kryo.test.Person [28]
00:00 TRACE: [kryo] Cached Position field: position (com.hiway.kryo.test.Person)
00:00 TRACE: [kryo] Cached Long field: id (com.hiway.kryo.test.Person)
00:00 TRACE: [kryo] Register class name: com.hiway.kryo.test.Person (com.esotericsoftware.kryo.serializers.FieldSerializer)
00:00 TRACE: [kryo] Read field Long: id (com.hiway.kryo.test.Person) [28]
00:00 TRACE: [kryo] Read: -49 (Long) [30]
00:00 TRACE: [kryo] Read field Position: position (com.hiway.kryo.test.Person) [30]
00:00 TRACE: [kryo] Object graph complete.
Exception in thread "main" com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 97
Serialization trace:
position (com.hiway.kryo.test.Person)
	at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:157)
	at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:677)
	at com.esotericsoftware.kryo.serializers.ReflectField.read(ReflectField.java:107)
	at com.esotericsoftware.kryo.serializers.FieldSerializer.read(FieldSerializer.java:122)
	at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:799)
	at com.hiway.kryo.test.Main.deserialize(Main.java:85)
	at com.hiway.kryo.test.Main.testKryo5(Main.java:55)
	at com.hiway.kryo.test.Main.main(Main.java:34)
isaki

isaki commented on Apr 17, 2019

@isaki
Contributor

Unit Tests fail; for some odd reason primitives are getting the correct Unsafe cache field, but the value class is the boxed version which throws on my validation. It will take me a bit longer to button this up as a result; might not be done tonight.

NathanSweet

NathanSweet commented on May 3, 2019

@NathanSweet
Member

Thanks @isaki for digging into the problem (both problems, the crash and the unit tests) and providing a PR. I'll commit a fix slightly different from the PR (we can fix the unit test differently and I prefer not putting issues in comments, as it adds a lot of noise over time and is easily outdated).

4 remaining items

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @NathanSweet@HiwayChe@isaki

        Issue actions

          jvm crash when field type changed · Issue #663 · EsotericSoftware/kryo