OOP/AD basic

本文为普及OO基础知识而作,对比了PO和OO的代码重用方式,指出OO在模板重用方面有语法优势。认为OOAD是积累数据建模知识,而非学UML或哲学。还探讨了开发过程,倾向XP做法,提出UI先行,经分析、建模后按XP原则开发。
OOP/AD basic
本文是为了配合庄子的论文,做一些OO的基础知识普及工作。
当然,即使是OO基础知识,我也不一定有足够的资格来普及,主要目的还是为了相互学习,共同进步。因此,为了便于读者找出漏洞,进行批评和抨击,帮助我进步,我尽量使用朴实无华,简单易懂的语言。用咱老百姓自己的话,讲述老百姓自己的故事。
为了突出重点,加强效果,文中不免矫枉过正,提出一些片面极端的看法。
为了方便起见,我也把Procedure Oriented称为PO。

1.代码重用
评价一门语言的重要标准之一,就是代码重用程度。PO的代码重用主要有两种方式:(1) 模块重用 Module Reuse (2) 模板重用Template Reuse

模块重用。比如,一个 a 模块,b调用a,c也调用a。这时候,a就是重用的。这种情况比较简单,PO已经做得非常好了,OO这方面没有什么太大的超越。

模板重用。一个处理流程的整个步骤都是固定的,就是其中一些部分是变化的。比如,在那个Design Pattern帖子里面。
http://forum.iteye.com/viewtopic.php?p=82944
那个排序的例子里面,sort算法是重用的,comparator是变化的。这个时候,sort就是一个模板template,comparator属于模板template中的变量。
OO在模板重用这个方面具有超越PO的语法优势。PO一般用Callback Function Pointer实现模板重用,而OO的Class内置支持this指针,具有了携带额外信息的能力。

2.OOP只是一种语法现象
PO如果要达到OO的效果,则需要用Struct + callback function pointer来模拟实现。C的语法记不清楚了,下面的代码就是一个示意。

struct Comparator{
void * info;
int (*compare) (Runnable * this, Record a, Record b); // compare is a function pointer
// 注:具体的OO实现中,为了处理继承的多态,
//虚函数指针不是直接放在这里,而是放在一个虚函数表
};

….

void sort(Record[] records,Comparator * comparator){
for(int i =….){
for(int j=….){
if(comparator->compare(comparator, records[i] > records[j]) > 0)
// swap records[i] and records[j]
}
}
}


如果要实现ReverseComparator,那么相当麻烦。


int reverseCompare(Runnable * this, Record a, Record b){
Comparator* originalComparator = (Comparator *)this->info;

return – originalComparator->compare(this, a, b);
}

….
Comparator field1Comparator;
… set up field1Comparator

Comparator reverseComparator;
reverseComparator.info = &field1Comparator;
reverseComparator.compare = reverseCompare; // function pointer

sort(records, &reverseComparator); // reverse order


可以看到,PO实现高级的模板重用,不是不能做到,而是做起来非常麻烦。而OO语法内在就支持这种高级的模板重用。另外,OO语法的继承,对代码重用也有良好的效果,不过,目前继承好像有成为反模式的趋势,我就不多说了。怎么方便怎么用,代码简单,才是硬道理。

3.OOAD = Modeling
我同意庄子对“OO哲学”的批判意见。
OO书籍,我的观点是,只有OOP的经典书籍才值得细细研读。
大部分OOAD的方法论书籍,都在描述大而空的例子,而不是关注具体需求。

说实话,我们大部分人在做应用软件,而不是系统软件。处理的是业务的复杂度,而不是算法的难度。而大部分的OOAD方法论书籍,也是面向应用软件的。

如何处理业务的复杂度?无他,但手熟尔,全凭着行业经验的积累。一个不熟悉某个业务领域的程序员,要在两方面下功夫:(1)努力学习业务领域的知识 (2)努力提高业务建模能力。
如何提高业务建模能力?无他,但模仿尔,全凭着大师的经典著作。如Dlee推荐的《数据建模资源手册》,Martin Fowler写的《分析模式》等。这两本书讲述的都是需求中常见的业务模型,如人员组织,财务税务,生产销售,人力资源,等。
经典建模书籍,不可能包括所有的工作中需要的模型。碰到这种情况,一方面要尽量搜寻现有的经典案例,一方面要获取经典模型中的精髓,类推,举一反三,
在我看来,OOAD就是要积累这些数据建模知识,而不是学UML,也不是学哲学。当然,这只是囿于我目前的眼界和地位。
我希望将来有一天,我也能够达到这样的崇高的地位,靠谈论OO哲学过日子,而不是靠OO建模过日子。那意味着,我已经进入了制定规则的Top 10%, 脱离了开发工作的第一线了。
现在以我的程度,就开始依靠大谈OO哲学思想来获利,相当于大跃进,脱离了现有生产力发展阶段的现实;是要遭到痛斥的,“你这个穷小子,想混进我们这个富人俱乐部,别做梦了。”

4.过程
个人偏见,我认为,OOA 就是 A for OOP,OOD就是D for OOP。分析设计的时候,即使不考虑具体实现细节,也至少要考虑到实现的可行性和难易程度。
CMM类的过程强调,分析设计的时候,千万不能考虑具体实现,一旦考虑了具体实现,不仅是乱了规矩,而且是落了下层。
相比于CMM,我有些倾向于XP的实现和分析设计交织的做法。
我表达过对“良好的设计从重构中产生”的怀疑。我觉得,重构不一定能够保证产生良好的设计,反而可能产生过度设计。这也许只是囿于个人眼界的偏见。这个问题在另外的帖子里面讨论过了,就不在此赘述。

我觉得比较好的过程是这样:
(1) UI 先行。先画出UI Mockup。对于Webapp来说,通常是HTML Prototype。
(2) 在此基础上,写出简单的用户操作手册。
(3) 一项项具体分析该系统实现中可能遇到的瓶颈,评估可行性,风险性,选择实现方案。
(4) 数据建模。
(5) 按照XP原则进入到开发阶段:测试先行,开发,重构,迭代,集成,迅速发布。这是目前我所知道的代码管理的最佳方案了。
# # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb8be33a0d, pid=19664, tid=19972 # # JRE version: OpenJDK Runtime Environment JBR-21.0.6+9-895.109-jcef (21.0.6+9) (build 21.0.6+9-b895.109) # Java VM: OpenJDK 64-Bit Server VM JBR-21.0.6+9-895.109-jcef (21.0.6+9-b895.109, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x363a0d] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # If you would like to submit a bug report, please visit: # https://youtrack.jetbrains.com/issues/JBR # --------------- S U M M A R Y ------------ Command Line: abort vfprintf -XX:ErrorFile=C:\Users\Administrator\java_error_in_pycharm_%p.log -XX:HeapDumpPath=C:\Users\Administrator\java_error_in_pycharm.hprof -Xms256m -Xmx1500m -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -XX:CICompilerCount=2 -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions -XX:TieredOldPercentage=100000 -ea -Dsun.io.useCanonCaches=false -Dsun.java2d.metal=true -Djbr.catch.SIGABRT=true -Djdk.http.auth.tunneling.disabledSchemes="" -Djdk.attach.allowAttachSelf=true -Djdk.module.illegalAccess.silent=true -Djdk.nio.maxCachedBufferSize=2097152 -Djava.util.zip.use.nio.for.zip.file.access=true -Dkotlinx.coroutines.debug=off -Dllm.show.ai.promotion.window.on.start=false -Djb.vmOptionsFile=C:\Program Files\JetBrains\PyCharm Community Edition 2025.1.1\bin/pycharm64.exe.vmoptions -Xbootclasspath/a:C:\Program Files\JetBrains\PyCharm Community Edition 2025.1.1/lib/nio-fs.jar -Djava.system.class.loader=com.intellij.util.lang.PathClassLoader -Didea.vendor.name=JetBrains -Didea.paths.selector=PyCharmCE2025.1 -Djna.boot.library.path=C:\Program Files\JetBrains\PyCharm Community Edition 2025.1.1/lib/jna/amd64 -Djna.nosys=true -Djna.noclasspath=true -Dpty4j.preferred.native.folder=C:\Program Files\JetBrains\PyCharm Community Edition 2025.1.1/lib/pty4j -Dio.netty.allocator.type=pooled -Dintellij.platform.runtime.repository.path=C:\Program Files\JetBrains\PyCharm Community Edition 2025.1.1/modules/module-descriptors.jar -Didea.platform.prefix=PyCharmCore -Dwsl.use.remote.agent.for.nio.filesystem=true -Djava.nio.file.spi.DefaultFileSystemProvider=com.intellij.platform.core.nio.fs.MultiRoutingFileSystemProvider -Dsplash=true -Daether.connector.resumeDownloads=false -Dcompose.swing.render.on.graphics=true --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.ref=ALL-UNNAMED --add-opens=java.base/java.lang.reflect=ALL-UNNAMED --add-opens=java.base/java.net=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.nio.charset=ALL-UNNAMED --add-opens=java.base/java.text=ALL-UNNAMED --add-opens=java.base/java.time=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.atomic=ALL-UNNAMED --add-opens=java.base/java.util.concurrent.locks=ALL-UNNAMED --add-opens=java.base/jdk.internal.vm=ALL-UNNAMED --add-opens=java.base/sun.net.dns=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.nio.fs=ALL-UNNAMED --add-opens=java.base/sun.security.ssl=ALL-UNNAMED --add-opens=java.base/sun.security.util=ALL-UNNAMED --add-opens=java.desktop/com.sun.java.swing=ALL-UNNAMED --add-opens=java.desktop/java.awt=ALL-UNNAMED --add-opens=java.desktop/java.awt.dnd.peer=ALL-UNNAMED --add-opens=java.desktop/java.awt.event=ALL-UNNAMED --add-opens=java.desktop/java.awt.font=ALL-UNNAMED --add-opens=java.desktop/java.awt.image=ALL-UNNAMED --add-opens=java.desktop/java.awt.peer=ALL-UNNAMED --add-opens=java.desktop/javax.swing=ALL-UNNAMED --add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED --add-opens=java.desktop/javax.swing.text=ALL-UNNAMED --add-opens=java.desktop/javax.swing.text.html=ALL-UNNAMED --add-opens=java.desktop/sun.awt=ALL-UNNAMED --add-opens=java.desktop/sun.awt.datatransfer=ALL-UNNAMED --add-opens=java.desktop/sun.awt.image=ALL-UNNAMED --add-opens=java.desktop/sun.awt.windows=ALL-UNNAMED --add-opens=java.desktop/sun.font=ALL-UNNAMED --add-opens=java.desktop/sun.java2d=ALL-UNNAMED --add-opens=java.desktop/sun.swing=ALL-UNNAMED --add-opens=java.management/sun.management=ALL-UNNAMED --add-opens=jdk.attach/sun.tools.attach=ALL-UNNAMED --add-opens=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-opens=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED --add-opens=jdk.jdi/com.sun.tools.jdi=ALL-UNNAMED -Dide.native.launcher=true -Djcef.sandbox.ptr=000001C3FF477220 -Djcef.sandbox.cefVersion=122.1.9+gd14e051+chromium-122.0.6261.94 com.intellij.idea.Main Host: Intel(R) Core(TM) i9-14900K, 32 cores, 95G, Windows 11 , 64 bit Build 26100 (10.0.26100.3912) Time: Wed May 14 10:42:32 2025 Windows 11 , 64 bit Build 26100 (10.0.26100.3912) elapsed time: 10.140251 seconds (0d 0h 0m 10s) --------------- T H R E A D --------------- Current thread (0x000001c4197deb60): WorkerThread "GC Thread#11" [id=19972, stack(0x000000ae4b800000,0x000000ae4b900000) (1024K)] Stack: [0x000000ae4b800000,0x000000ae4b900000], sp=0x000000ae4b8ff830, free space=1022k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0x363a0d] V [jvm.dll+0x3641ff] C 0x000001c4712c0ee8 siginfo: EXCEPTION_ACCESS_VIOLATION (0xc0000005), reading address 0x0000000000000082 Registers: RAX=0x0000000000000000, RBX=0x00000000ab23775d, RCX=0x00000000af485b18, RDX=0x00000000ab23775d RSP=0x000000ae4b8ff830, RBP=0x0000000041004d00, RSI=0x00000000b55a6b40, RDI=0x00000000ab23775d R8 =0x0000000000000041, R9 =0x00000000a2e90648, R10=0x00007ffbc5540000, R11=0x00007ffbc55415c3 R12=0x0000000000000009, R13=0x00000000b55a74f0, R14=0x000001c3ad04d8c0, R15=0x00000000ab2376f0 RIP=0x00007ffb8be33a0d, EFLAGS=0x0000000000010206 XMM[0]=0x000001000004d5c0 0x0000000000000009 XMM[1]=0x0000000000000000 0xa2e90648b55a7538 XMM[2]=0x0000000000000000 0x0000000000000000 XMM[3]=0x0000000000000000 0x0000000000000000 XMM[4]=0x0000000000000000 0x0000000000000000 XMM[5]=0x0000000000000000 0x0000000000000000 XMM[6]=0x0000000000000000 0x0000000000000000 XMM[7]=0x0000000000000000 0x0000000000000000 XMM[8]=0x0000000000000000 0x0000000000000000 XMM[9]=0x0000000000000000 0x0000000000000000 XMM[10]=0x0000000000000000 0x0000000000000000 XMM[11]=0x0000000000000000 0x0000000000000000 XMM[12]=0x0000000000000000 0x0000000000000000 XMM[13]=0x0000000000000000 0x0000000000000000 XMM[14]=0x0000000000000000 0x0000000000000000 XMM[15]=0x0000000000000000 0x0000000000000000 MXCSR=0x00001fa0 Register to memory mapping: RAX=0x0 is null RBX= [error occurred during error reporting (printing register info), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb8badcce1] RCX=0x00000000af485b18 is an oop: java.lang.String {0x00000000af485b18} - klass: 'java/lang/String' - string: "waterwoman/!" - ---- fields (total size 3 words): - private 'hash' 'I' @12 0 (0x00000000) - private final 'coder' 'B' @16 0 (0x00) - private 'hashIsZero' 'Z' @17 false (0x00) - injected 'flags' 'B' @18 0 (0x00) - private final 'value' '[B' @20 [B{0x00000000af485b30} (0xaf485b30) RDX= [error occurred during error reporting (printing register info, attempt 2), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb8badcce1] RSP=0x000000ae4b8ff830 points into unknown readable memory: 0x00000000b55424d0 | d0 24 54 b5 00 00 00 00 RBP=0x0000000041004d00 is an unknown value RSI=0x00000000b55a6b40 is an oop: java.lang.Class {0x00000000b55a6b40} - klass: 'java/lang/Class' - ---- fields (total size 25 words): - private volatile transient 'classRedefinedCount' 'I' @12 0 (0x00000000) - injected 'klass' 'J' @16 1939970991904 (0x000001c3af482720) - injected 'array_klass' 'J' @24 0 (0x0000000000000000) - injected 'oop_size' 'I' @32 25 (0x00000019) - injected 'static_oop_field_count' 'I' @36 1 (0x00000001) - private volatile transient 'cachedConstructor' 'Ljava/lang/reflect/Constructor;' @40 null (0x00000000) - private transient 'name' 'Ljava/lang/String;' @44 "org.apache.lucene.util.fst.FST"{0x00000000b55a6c38} (0xb55a6c38) - private transient 'module' 'Ljava/lang/Module;' @48 a 'java/lang/Module'{0x00000000a2e82718} (0xa2e82718) - private final 'classLoader' 'Ljava/lang/ClassLoader;' @52 a 'com/intellij/util/lang/PathClassLoader'{0x00000000a2e7aa80} (0xa2e7aa80) - private transient 'classData' 'Ljava/lang/Object;' @56 null (0x00000000) - private transient 'packageName' 'Ljava/lang/String;' @60 "org.apache.lucene.util.fst"{0x00000000b5543a20} (0xb5543a20) - private final 'componentType' 'Ljava/lang/Class;' @64 null (0x00000000) - private volatile transient 'reflectionData' 'Ljava/lang/ref/SoftReference;' @68 a 'java/lang/ref/SoftReference'{0x00000000b55a6c80} (0xb55a6c80) - private volatile transient 'genericInfo' 'Lsun/reflect/generics/repository/ClassRepository;' @72 null (0x00000000) - private volatile transient 'enumConstants' '[Ljava/lang/Object;' @76 null (0x00000000) - private volatile transient 'enumConstantDirectory' 'Ljava/util/Map;' @80 null (0x00000000) - private volatile transient 'annotationData' 'Ljava/lang/Class$AnnotationData;' @84 null (0x00000000) - private volatile transient 'annotationType' 'Lsun/reflect/annotation/AnnotationType;' @88 null (0x00000000) - transient 'classValueMap' 'Ljava/lang/ClassValue$ClassValueMap;' @92 null (0x00000000) - injected 'protection_domain' 'Ljava/lang/Object;' @96 a 'java/security/ProtectionDomain'{0x00000000a2e906d0} (0xa2e906d0) - injected 'signers_name' 'Ljava/lang/Object;' @100 null (0x00000000) - injected 'source_file' 'Ljava/lang/Object;' @104 null (0x00000000) - injected '<init_lock>' 'Ljava/lang/Object;' @108 null (0x00000000) - signature: Lorg/apache/lucene/util/fst/FST; - ---- static fields (1): - private static final 'BASE_RAM_BYTES_USED' 'J' @120 24 (0x0000000000000018) - static final 'BIT_FINAL_ARC' 'I' @144 1 (0x00000001) - static final 'BIT_LAST_ARC' 'I' @148 2 (0x00000002) - static final 'BIT_TARGET_NEXT' 'I' @152 4 (0x00000004) - static final 'BIT_STOP_NODE' 'I' @156 8 (0x00000008) - public static final 'BIT_ARC_HAS_OUTPUT' 'I' @160 16 (0x00000010) - static final 'BIT_ARC_HAS_FINAL_OUTPUT' 'I' @164 32 (0x00000020) - public static final 'ARCS_FOR_BINARY_SEARCH' 'B' @196 32 (0x20) - static final 'ARCS_FOR_DIRECT_ADDRESSING' 'B' @197 64 (0x40) - static final 'ARCS_FOR_CONTINUOUS' 'B' @198 96 (0x60) - private static final 'FILE_FORMAT_NAME' 'Ljava/lang/String;' @112 "FST"{0x00000000b55a6c08} (0xb55a6c08) - public static final 'VERSION_START' 'I' @168 6 (0x00000006) - private static final 'VERSION_LITTLE_ENDIAN' 'I' @172 8 (0x00000008) - public static final 'VERSION_CONTINUOUS_ARCS' 'I' @176 9 (0x00000009) - public static final 'VERSION_CURRENT' 'I' @180 9 (0x00000009) - public static final 'VERSION_90' 'I' @184 8 (0x00000008) - static final 'FINAL_END_NODE' 'J' @128 -1 (0xffffffffffffffff) - static final 'NON_FINAL_END_NODE' 'J' @136 0 (0x0000000000000000) - public static final 'END_LABEL' 'I' @188 -1 (0xffffffff) - private static final 'DEFAULT_MAX_BLOCK_BITS' 'I' @192 30 (0x0000001e) - static final synthetic '$assertionsDisabled' 'Z' @199 false (0x00) RDI= [error occurred during error reporting (printing register info, attempt 3), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb8badcce1] Top of Stack: (sp=0x000000ae4b8ff830) 0x000000ae4b8ff830: 00000000b55424d0 0000000000000000 0x000000ae4b8ff840: 00000000ab236e8c 00007ffb8be33a29 0x000000ae4b8ff850: 00000000ab237701 00007ffb8be341ff 0x000000ae4b8ff860: 00000000ab23775d 00000000b55a6b40 0x000000ae4b8ff870: 000001c4712c0ec0 00007ffb8be3499c 0x000000ae4b8ff880: 00000000ab23770c 00007ffb8be341ff 0x000000ae4b8ff890: 00000000ab23770c 000001c4712c0ee8 0x000000ae4b8ff8a0: 000001c3ad04d8c8 0000000000000005 0x000000ae4b8ff8b0: 000001c3ad04d5c0 000001c4712c0d60 0x000000ae4b8ff8c0: 00000000ab2376f0 00007ffb8be35b1c 0x000000ae4b8ff8d0: 0000000000000009 0000000000000009 0x000000ae4b8ff8e0: 0000000000000001 0000000900000000 0x000000ae4b8ff8f0: 00000000ab22fafc 00007ffb8be33a29 0x000000ae4b8ff900: 000001c43eb029a0 00007ffb8c1f80db 0x000000ae4b8ff910: 0000000000000009 0000000000000000 0x000000ae4b8ff920: 000001c4712c0ee8 0000000000000000 0x000000ae4b8ff930: 0000000000000040 000001c4197e0f30 0x000000ae4b8ff940: 000000000000000f 00000000ab236f24 0x000000ae4b8ff950: 000001c3fff7a790 0000000000000cf3 0x000000ae4b8ff960: 000001c4712c0d60 00007ffb8be3689a 0x000000ae4b8ff970: 000001c4712c0000 0000000000000100 0x000000ae4b8ff980: 000001c300000000 0000000000000009 0x000000ae4b8ff990: 00000000a73a0800 00000000000003c0 0x000000ae4b8ff9a0: 000000ae4b8ffb90 000000000000004f 0x000000ae4b8ff9b0: 00000000a73a2600 00007ffb8be32fee 0x000000ae4b8ff9c0: 000001c3ab7721f0 000001c4712c0d60 0x000000ae4b8ff9d0: 00000000a73a0800 00000000000003c0 0x000000ae4b8ff9e0: 000000000603a02f 0000000000000000 0x000000ae4b8ff9f0: 000000000000000f 000000ae4b8ffb90 0x000000ae4b8ffa00: 000001c3ab7721f0 00007ffb8be3ffac 0x000000ae4b8ffa10: 00000000000003c0 000001c3ab7721f0 0x000000ae4b8ffa20: 000000ae4b8ffb90 00007ffb8c1ae63f Instructions: (pc=0x00007ffb8be33a0d) 0x00007ffb8be3390d: cc cc cc 48 89 6c 24 10 48 89 74 24 18 57 48 83 0x00007ffb8be3391d: ec 20 48 8b 32 48 8b fa 48 8b e9 48 85 f6 74 79 0x00007ffb8be3392d: 48 8b 41 10 4c 8b c6 48 89 5c 24 30 8b 88 b0 05 0x00007ffb8be3393d: 00 00 48 8b 80 a0 05 00 00 49 d3 e8 42 0f b7 1c 0x00007ffb8be3394d: 40 0f b7 c3 66 c1 e8 08 84 c0 78 0b 48 8b 4d 18 0x00007ffb8be3395d: e8 de 27 00 00 eb 3d 8b 0d a6 2d 95 00 48 8b c6 0x00007ffb8be3396d: 48 33 c7 48 d3 e8 48 85 c0 74 29 4c 8b ce 4c 8b 0x00007ffb8be3397d: c7 0f b7 d3 48 8b cd e8 57 01 00 00 83 7d 20 01 0x00007ffb8be3398d: 74 12 48 8b 4d 18 4c 8b ce 4c 8b c7 0f b7 d3 e8 0x00007ffb8be3399d: df 00 00 00 48 8b 5c 24 30 48 8b 6c 24 38 48 8b 0x00007ffb8be339ad: 74 24 40 48 83 c4 20 5f c3 cc cc cc cc cc cc cc 0x00007ffb8be339bd: cc cc cc 48 89 74 24 18 57 48 83 ec 20 8b 02 48 0x00007ffb8be339cd: 8b fa 48 8b f1 85 c0 0f 84 98 00 00 00 8b 0d c8 0x00007ffb8be339dd: 55 8e 00 48 89 5c 24 30 48 89 6c 24 38 8b e8 48 0x00007ffb8be339ed: 8b 46 10 48 d3 e5 48 03 2d a6 55 8e 00 4c 8b c5 0x00007ffb8be339fd: 8b 88 b0 05 00 00 48 8b 80 a0 05 00 00 49 d3 e8 0x00007ffb8be33a0d: 42 0f b7 1c 40 0f b7 c3 66 c1 e8 08 84 c0 78 0e 0x00007ffb8be33a1d: 48 8b 4e 18 48 ff c2 e8 17 27 00 00 eb 3d 8b 0d 0x00007ffb8be33a2d: df 2c 95 00 48 8b c5 48 33 c7 48 d3 e8 48 85 c0 0x00007ffb8be33a3d: 74 29 4c 8b cd 4c 8b c7 0f b7 d3 48 8b ce e8 00 0x00007ffb8be33a4d: 02 00 00 83 7e 20 01 74 12 48 8b 4e 18 4c 8b cd 0x00007ffb8be33a5d: 4c 8b c7 0f b7 d3 e8 18 00 00 00 48 8b 5c 24 30 0x00007ffb8be33a6d: 48 8b 6c 24 38 48 8b 74 24 40 48 83 c4 20 5f c3 0x00007ffb8be33a7d: cc cc cc 84 d2 74 4e 48 89 5c 24 08 57 48 83 ec 0x00007ffb8be33a8d: 20 48 8b 41 60 48 8b f9 8b 0d 21 41 94 00 49 8b 0x00007ffb8be33a9d: d8 48 d3 eb 48 03 58 30 48 8b 50 28 48 2b da 48 0x00007ffb8be33aad: 39 9f b8 01 00 00 74 13 48 03 d3 48 8d 4f 18 e8 0x00007ffb8be33abd: bf 6f 00 00 48 89 9f b8 01 00 00 48 8b 5c 24 30 0x00007ffb8be33acd: 48 83 c4 20 5f c3 cc cc cc cc cc cc cc cc cc cc 0x00007ffb8be33add: cc cc cc 40 56 48 83 ec 20 66 c1 ea 08 49 8b f0 0x00007ffb8be33aed: 80 fa fd 75 40 48 8b 51 10 8b 8a 18 02 00 00 48 0x00007ffb8be33afd: 8b 82 10 02 00 00 48 d3 e0 8b 0d 04 2c 95 00 4c Stack slot to memory mapping: stack at sp + 0 slots: 0x00000000b55424d0 is an oop: [B {0x00000000b55424d0} - klass: {type array byte} - length: 52 stack at sp + 1 slots: 0x0 is null stack at sp + 2 slots: 0x00000000ab236e8c is pointing into object: java.lang.ref.SoftReference {0x00000000ab236e80} - klass: 'java/lang/ref/SoftReference' - ---- fields (total size 5 words): - private 'referent' 'Ljava/lang/Object;' @12 a 'java/lang/Class$ReflectionData'{0x00000000ab236ea8} (0xab236ea8) - volatile 'queue' 'Ljava/lang/ref/ReferenceQueue;' @16 a 'java/lang/ref/ReferenceQueue$Null'{0x00000000a2e7b2c8} (0xa2e7b2c8) - volatile 'next' 'Ljava/lang/ref/Reference;' @20 null (0x00000000) - private transient 'discovered' 'Ljava/lang/ref/Reference;' @24 null (0x00000000) - private 'timestamp' 'J' @32 40073 (0x0000000000009c89) stack at sp + 3 slots: 0x00007ffb8be33a29 jvm.dll stack at sp + 4 slots: 0x00000000ab237701 is pointing into object: java.lang.reflect.Field {0x00000000ab2376f0} - klass: 'java/lang/reflect/Field' - ---- fields (total size 9 words): - 'override' 'Z' @12 false (0x00) - volatile 'accessCheckCache' 'Ljava/lang/Object;' @16 null (0x00000000) - private final 'trustedFinal' 'Z' @13 true (0x01) - private final 'slot' 'I' @20 11 (0x0000000b) - private final 'modifiers' 'I' @24 26 (0x0000001a) - private final 'clazz' 'Ljava/lang/Class;' @28 a 'java/lang/Class'{0x00000000ab236d40} = 'org/apache/lucene/util/fst/FST' (0xab236d40) - private final 'name' 'Ljava/lang/String;' @32 "FILE_FORMAT_NAME"{0x00000000abe1dc08} (0xabe1dc08) - private final 'type' 'Ljava/lang/Class;' @36 a 'java/lang/Class'{0x00000000a2e90648} = 'java/lang/String' (0xa2e90648) - private final transient 'signature' 'Ljava/lang/String;' @40 null (0x00000000) - private volatile transient 'genericInfo' 'Lsun/reflect/generics/repository/FieldRepository;' @44 null (0x00000000) - private final 'annotations' '[B' @48 null (0x00000000) - private 'fieldAccessor' 'Ljdk/internal/reflect/FieldAccessor;' @52 null (0x00000000) - private 'overrideFieldAccessor' 'Ljdk/internal/reflect/FieldAccessor;' @56 null (0x00000000) - private 'root' 'Ljava/lang/reflect/Field;' @60 null (0x00000000) - private volatile transient 'declaredAnnotations' 'Ljava/util/Map;' @64 null (0x00000000) stack at sp + 5 slots: 0x00007ffb8be341ff jvm.dll stack at sp + 6 slots: [error occurred during error reporting (inspecting top of stack), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb8badcce1] stack at sp + 7 slots: 0x00000000b55a6b40 is an oop: java.lang.Class {0x00000000b55a6b40} - klass: 'java/lang/Class' - ---- fields (total size 25 words): - private volatile transient 'classRedefinedCount' 'I' @12 0 (0x00000000) - injected 'klass' 'J' @16 1939970991904 (0x000001c3af482720) - injected 'array_klass' 'J' @24 0 (0x0000000000000000) - injected 'oop_size' 'I' @32 25 (0x00000019) - injected 'static_oop_field_count' 'I' @36 1 (0x00000001) - private volatile transient 'cachedConstructor' 'Ljava/lang/reflect/Constructor;' @40 null (0x00000000) - private transient 'name' 'Ljava/lang/String;' @44 "org.apache.lucene.util.fst.FST"{0x00000000b55a6c38} (0xb55a6c38) - private transient 'module' 'Ljava/lang/Module;' @48 a 'java/lang/Module'{0x00000000a2e82718} (0xa2e82718) - private final 'classLoader' 'Ljava/lang/ClassLoader;' @52 a 'com/intellij/util/lang/PathClassLoader'{0x00000000a2e7aa80} (0xa2e7aa80) - private transient 'classData' 'Ljava/lang/Object;' @56 null (0x00000000) - private transient 'packageName' 'Ljava/lang/String;' @60 "org.apache.lucene.util.fst"{0x00000000b5543a20} (0xb5543a20) - private final 'componentType' 'Ljava/lang/Class;' @64 null (0x00000000) - private volatile transient 'reflectionData' 'Ljava/lang/ref/SoftReference;' @68 a 'java/lang/ref/SoftReference'{0x00000000b55a6c80} (0xb55a6c80) - private volatile transient 'genericInfo' 'Lsun/reflect/generics/repository/ClassRepository;' @72 null (0x00000000) - private volatile transient 'enumConstants' '[Ljava/lang/Object;' @76 null (0x00000000) - private volatile transient 'enumConstantDirectory' 'Ljava/util/Map;' @80 null (0x00000000) - private volatile transient 'annotationData' 'Ljava/lang/Class$AnnotationData;' @84 null (0x00000000) - private volatile transient 'annotationType' 'Lsun/reflect/annotation/AnnotationType;' @88 null (0x00000000) - transient 'classValueMap' 'Ljava/lang/ClassValue$ClassValueMap;' @92 null (0x00000000) - injected 'protection_domain' 'Ljava/lang/Object;' @96 a 'java/security/ProtectionDomain'{0x00000000a2e906d0} (0xa2e906d0) - injected 'signers_name' 'Ljava/lang/Object;' @100 null (0x00000000) - injected 'source_file' 'Ljava/lang/Object;' @104 null (0x00000000) - injected '<init_lock>' 'Ljava/lang/Object;' @108 null (0x00000000) - signature: Lorg/apache/lucene/util/fst/FST; - ---- static fields (1): - private static final 'BASE_RAM_BYTES_USED' 'J' @120 24 (0x0000000000000018) - static final 'BIT_FINAL_ARC' 'I' @144 1 (0x00000001) - static final 'BIT_LAST_ARC' 'I' @148 2 (0x00000002) - static final 'BIT_TARGET_NEXT' 'I' @152 4 (0x00000004) - static final 'BIT_STOP_NODE' 'I' @156 8 (0x00000008) - public static final 'BIT_ARC_HAS_OUTPUT' 'I' @160 16 (0x00000010) - static final 'BIT_ARC_HAS_FINAL_OUTPUT' 'I' @164 32 (0x00000020) - public static final 'ARCS_FOR_BINARY_SEARCH' 'B' @196 32 (0x20) - static final 'ARCS_FOR_DIRECT_ADDRESSING' 'B' @197 64 (0x40) - static final 'ARCS_FOR_CONTINUOUS' 'B' @198 96 (0x60) - private static final 'FILE_FORMAT_NAME' 'Ljava/lang/String;' @112 "FST"{0x00000000b55a6c08} (0xb55a6c08) - public static final 'VERSION_START' 'I' @168 6 (0x00000006) - private static final 'VERSION_LITTLE_ENDIAN' 'I' @172 8 (0x00000008) - public static final 'VERSION_CONTINUOUS_ARCS' 'I' @176 9 (0x00000009) - public static final 'VERSION_CURRENT' 'I' @180 9 (0x00000009) - public static final 'VERSION_90' 'I' @184 8 (0x00000008) - static final 'FINAL_END_NODE' 'J' @128 -1 (0xffffffffffffffff) - static final 'NON_FINAL_END_NODE' 'J' @136 0 (0x0000000000000000) - public static final 'END_LABEL' 'I' @188 -1 (0xffffffff) - private static final 'DEFAULT_MAX_BLOCK_BITS' 'I' @192 30 (0x0000001e) - static final synthetic '$assertionsDisabled' 'Z' @199 false (0x00) com.intellij.diagnostic.JBRCrash
05-15
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值