4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。 5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。 静态函数和静态变量具有相同的使用范围限制。...3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。...任何由编译器在未使用 /clr:initialAppDomain 时生成的对象代码都包含对 _check_commonlanguageruntime_version 函数的引用,该函数在 C 运行时库...nochkclr.obj 包含该函数的一个空版本,当您在运行库的版本 1 上运行应用程序时,nochkclr.obj 不生成错误信息。...有关可验证代码的更多信息,请参见产生可验证的 C++ 托管扩展组件。有关从托管 C++ 项目创建纯 MSIL 输出文件的更多信息,请参见将 C++ 托管扩展项目从混合模式转换成纯 IL。
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。 ...例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException...3、java.lang.NullPointerException 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。...当方法抛出异常列表的异常时,方法将不对这些类型及其子类类型的异常作处理,而抛向调用该方法的方法,由他去处理。...如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。
不同Java虚拟机实现上的内存结构千差万别。一部分实现可能占用很多内存,而其他以下可能只占用很少的内存;一些实现可 能会使用虚拟内存,而其他的则不使用。...每一个被加载的非抽象类,Java虚拟机都会为他们产生一个方法列表,这个列表中保存了这个类可能调用的所有实例 方法的引用,报错那些父类中调用的方法。...一个可能的堆的设计是将堆分为两个部分:引用池和对象池。一个对象的引用就是指向引用池的本地指针。每一个引用池中的条目都包含两个部分:指向对象池中对 象数据的指针和方法区中对象类数据的指针。...无论虚拟机实现者使用哪一种设计,他都可能为每一个对象保存一个类似方法列表的信息。因为他可以提升对象方法调用的速度,对提升虚拟机的性能非常重要,但 是虚拟机的规范中比没有要求必须实现类似的数据结构。...方法列表是一个指向所有可能被调用对象方法的指针数组。方法数据包括三个部分:操作码堆栈的大小和方法堆栈的本地变量区;方法的字节码;异常列表。
每一个被加载的非抽象类,Java虚拟机都会为他们产生一个方法列表,这个列表中保存了这个类可能调用的所有实例 方法的引用,报错那些父类中调用的方法。...一个可能的堆的设计是将堆分为两个部分:引用池和对象池。一个对象的引用就是指向引用池的本地指针。每一个引用池中的条目都包含两个部分:指向对象池中对 象数据的指针和方法区中对象类数据的指针。...无论虚拟机实现者使用哪一种设计,他都可能为每一个对象保存一个类似方法列表的信息。因为他可以提升对象方法调用的速度,对提升虚拟机的性能非常重要,但 是虚拟机的规范中比没有要求必须实现类似的数据结构。...方法列表是一个指向所有可能被调用对象方法的指针数组。方法数据包括三个部分:操作码堆栈的大小和方法堆栈的本地变量区;方法的字节码;异常列表。...Java虚拟机规范中指出垃圾收集一个运行一个对象的finalizer方法一次,但是容许 finalizer方法重新引用这个对象,当这个对象再次不被引用时,就不需要再次调用finalize方法。
如果线程正在执行的是一个Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie 方法,这个计数器值则为空(Undefined)。...虚拟机是使用局部变量表完成参数值到参数变量列表的传递过程的,如果是实例方法(非static),那么局部变量表的第0位索引的Slot默认是用于传递方法所属对象实例的引用,在方法中通过this访问。...如果代表栈帧A的方法想调用代表栈帧B的方法,那么这个虚拟机的方法调用指令就会以B方法的符号引用作为参数,但是因为符号引用并不是直接指向代表B方法的内存位置,所以在调用之前还必须要将符号引用转换为直接引用...2.5异常 在Java 虚拟机规范中,对虚拟机栈规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError 异常;如果虚拟机栈可以动态扩展(当前大部分的Java...3、JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收)。释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
应用程序可以为这个类创建子类,以指示类似的异常 15:NullPointerException(空指针异常) 空指针异常,可能会发生在对象的引用区域为空,经常就是对象没有合适的初始化,导致没有明确的引用...当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括: 调用 null 对象的实例方法。 访问或修改 null 对象的字段。 将 null 作为一个数组,获得其长度。...4:ClosedChannelException(关闭禁止异常) 当试图对已关闭的、或者至少对某个 I/O 操作已关闭的信道上调用或完成该操作时,抛出此经过检查的异常。...2: RowSetWarning(一个扩展上的异常) SQLException 的一个扩展,提供关于在 RowSet 对象上设置的数据库警告的信息。...这些警告正常链接到其方法调用会导致报告警告的那些对象。此类对 SQLWarning 类进行补充。
,保证了数据的安全性 ,并提高了代码的可维护性和可复用性 在代码上如何实现封装 属性私有化, 对外提供getter和setter方法 实现封装的步骤: 第一步:属性私有化(什么是私有化?...(实参) 语法: 只能出现在构造方法的第一行 通过当前构造方法调用本类中其他的构造方法 作用是:代码复用 this 本质上是一个引用 this 中保存的也是对象的内存地址 this...设计模式(Design Pattern)是一套被广泛接受的、经过试验验证的、可反复使用的基于面向对象的软件设计经验总结,它是软件开发人员在软件设计中,对常见问题的解决方案的总结和抽象。...中如何实现 [修饰符列表] class 类名 extends 父类名() extends 翻译为扩展 ,表示子类继承父类后 ,子类是对父类的扩展 继承相关的术语:当B类继承A类时 A类称为:父类 ,超类...迪米特法则:一个对象应该对其它对象保持最少的了解。即一个类应该对自己需要耦合或调用的类知道得最少。 合成复用原则:尽量使用对象组合和聚合,而不是继承来达到复用的目的。
百度的解释云里雾里,对于我们Java程序员,说白了就是: JVM本质上是一个程序,它能识别.class 字节码文件(里面存放的是我们对.java编译后产生的二进制代码),并且能够解析它的指令,最终调用操作系统上的函数...8大基本类型 对象引用 实例的方法 2、栈运行原理 栈表示Java方法执行的内存模型 每调用一个方法就会为每个方法生成一个栈帧(Stack Frame),每个方法被调用和完成的过程,都对应一个栈帧从虚拟机栈上入栈和出栈的过程...,则每当存满时就会触发一次轻GC(Minor GC) 轻GC清理后,有的对象可能还存在引用,就活下来了,活下来的对象就进入幸存区;有的对象没用了,就被GC清理掉了;每次轻GC都会使得伊甸园区为空...尝试扩大堆内存看结果 利用上述方法指定jvm试图使用的最大内存和jvm初始化内存大小 2....每当有一个引用指向该对象时,计数器加一;每当有一个指向它的引用被删除时,计数器减一。 这样,当没有引用指向该对象时,该对象死亡,计数器为0,这时就应该对这个对象进行垃圾回收操作。 ?
另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexlOf对list进行了遍历,当结 果为空时会遍历整个列表。 2.HashMap和HashTable有什么区别?...Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机 器上的机器码,然后在特定的机器上运行。...当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。...GC Roots的对象有: 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中JNI(即一般说的Native方法)引用的对象...,无法保证各个对象的调用顺序,不推荐大家使用,建议 遗忘它。
并吸收了其他语言的优点:模板字符串,运算符重载,方法扩展,命名参数等。 2,安全性 Kotlin提供了安全符“?”,当变量可以为null时,必须使用可空安全符?进行声明,否则会出现编译错误。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...其中非空引用的定义如下: 而可空引用需要使用安全符“?”,例如: 当调用的时候,也需要使用安全调用操作符,写作 ?. 可空调用。...例如: 通过函数调用给可空引用赋值,返回的必须也是可空引用,这就在编译期间杜绝了空指针异常。...但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。
,app类加载器--》扩展类加载器---》根类加载器,跟类加载器会调用源码的String,集自己写String不能覆盖源码 ?...,它的name就是在常量池中 } } java栈 8大基本类型+对象引用+实例的方法 主方法程序入栈,执行,调用其他方法时,其他方法再入栈执行,执行完返回,正在执行的方法在栈顶 栈满了,StackflowError...,一般是200层 堆 JVM分类 sun 热点虚拟机 jrockit,最快的jvm IBM,J9VMJIT jvm只有一个heap,大小可以调节,默认:实际使用1/64,试图申请内存的1/4(最大内存...垃圾回收都在伊甸园,老生区 伊甸园满了---》对伊甸园轻GC--->进入幸存区----》也满了---》对伊甸园,幸存区重GC-----》进入养老区---》又满了----》OOM 但进入老生区对象很少...-》轻GC---》到幸存区0(随机选一个) 伊甸园又满了---》轻GC--》存回对象会放到幸存区1,且就会把幸存区0的复制到幸存1,幸存0变为空 再此GC时,存活对象--》0,幸存1也复制到0 经历了15
,面向过程比较直接高效,而面向对象更易于复用、扩展和维护 面向对象 封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项 内部细节对外部调用透明,外部调用无需修改或者关心内部实现 (1)、...,而不需要自己再定义,只需扩展自己个性化的 多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。...(1)如果两个对象相等,则hashcode一定也是相同的 (2)两个对象相等,对两个对象分别调用equals方法都返回true (3)两个对象有相同的hashcode值,它们也不一定是相等的 (4...另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexlOf对list进行了遍历,当结 果为空时会遍历整个列表。 11、HashMap和HashTable有什么区别?...GC Roots的对象有: 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的对象 本地方法栈中JNI(即一般说的Native方法)引用的对象 可达性算法中的不可达对象并不是立即死亡的
“==”判断的是两个对象的内存地址是否一样,适用于原始数据类型和枚举类型(它们的变量存储的是值本身,而引用类型变量存储的是引用);equals是Object类的方法,Object对它的实现是比较内存地址...Java中多态的实现原理 所谓多态,指的就是父类引用指向子类对象,调用方法时会调用子类的实现而不是父类的实现。多态的实现的关键在于“动态绑定”。...详细介绍请戳 Java动态绑定的内部实现机制 简述Java中创建新线程的两种方法 继承Thread类(假设子类为MyThread),并重写run()方法,然后new一个MyThread对象并对其调用start...ArrayBlockingQueue: 一个基于数组实现的阻塞队列,它在构造时需要指定容量。当试图向满队列中添加元素或者从空队列中移除元素时,当前线程会被阻塞。...若工作者线程的执行比较慢(还没来得及向队列中插入元素),其他从队列中取元素的线程会等待它(试图从空队列中取元素从而阻塞);若工作者线程执行较快(试图向满队列中插入元素),则它会等待其它线程取出元素再继续执行
EmptyStackException 该异常由 Stack 类中的方法抛出,以表明堆栈为空。...NullPointerException 空指针引用异常 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括: 调用 null 对象的实例方法。...应用程序将会抛出NullPointerException类的实例,表明其他对 null 对象的非法使用 OverlappingFileLockException 试图获取某个文件区域上的锁定,而该区域与同一...),且该异常不可分配给该方法的throws子局声明的任何异常类,则由代理实例上的方法调用抛出此异常。...UnresolvedAddressException 试图对未解析的套接字地址调用网络操作时,抛出此未经检查的异常。
如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;若执行的是Native方法,则计数器为空(Undefined)(因为对于Native方法而言,它的方法体并不是由...JDK 1.8以前的永久代(PermGen) Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集,也就是说,Java虚拟机规范只是规定了方法区的概念和它的作用...Java虚拟机对Class文件每一部分(自然包括常量池)的格式有严格规定,每一个字节用于存储那种数据都必须符合规范上的要求才会被虚拟机认可、装载和执行。...并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。...对象的访问定位 我们的Java程序需要通过栈上的对象引用(reference)数据(存储在栈上的局部变量表中)来操作堆上的具体对象。
,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为“空闲列表”(Free List)。...7.到类Class的引用:虚拟机为每一个被装载的类型创建一个Class实例,用来代表这个被装载的类。 Java虚拟机规范规定该区域可抛出OutOfMemoryError。...这个特性给java带来了更强大的动态扩展能力,但也使得java方法调用过程变得相对复杂起来,需要在类加载期间,甚至到运行期间才能够确定目标方法的直接引用....,本质上两者并不等价,仅仅是因为HotSpot虚拟机的设计团队选择把GC分代收集扩展至方法区,或者说使用永久代来实现方法区而已。...Java虚拟机规范对这个区域的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。
对每个被装载的类型,虚拟机都会在方法区中存储以下类型信息: 类型的全类名 类型的直接付了的全类名 类型是类类型还是接口类型 这个类型的访问修饰符 父接口列表,列表中存储每个父接口的全类名 该类型的常量池...把新生成的对象引用压入栈中 10.通过解释器执行保存在方法区中当前类的无参构造函数,并将A对象引用作为隐式参数传入方法,然后对当前实例对象进行初始化 对象实例初始化分为三步: 分配内存,调用对象构造函数进行初始化...程序运行时需要转换某个对象的引用为另一种类型,虚拟机需要检查这种类型转换是否允许,被转换的对象是否的确是被引用的对象或者它的超类型 当程序中调用某个实例方法时,虚拟机必须进行动态绑定,换句话说,它不能按照引用的类型来就决定将要调用的方法...当某个线程拥有一个对象锁后,可以继续对这个锁追加请求,即锁可重入。 很多对象在整个生命周期内都没有被任何线程加锁,在线程实际请求某个对象的锁之前,实现对象锁需要的数据是不必要的。...本地方法是Java虚拟机指令集的一种可编程扩展。如果一条指令请求一个对本地方法的调用,执行引擎就会调用这个本地方法。运行这个本地方法就是Java虚拟机对这条指令的执行。
:算术异常 ArrayIndexOutOfBoundsException:数组下标越界异常 Next:下一个 NullPointerException:空引用异常 ClassNotFoundException...Object 对象 Class 类 Class member 类成员 Class method 类方法 Class variable 类变量 Constructor 构造方法...ekt] Overload [java] 方法的重载(不同参数列表的同名方法) [,?uv?'l?ud] Override [java] 方法的覆盖(覆盖父类的方法) [,?...ekt] Overload [java] 方法的重载(不同参数列表的同名方法)[,?uv?'l?ud] Override [java] 方法的覆盖(覆盖父类的方法)[,?uv?'...new 新的 number 数字 north 北方 null 空的 native 本地的 O.
实际上: 默认局部变量槽中索引0的是方法调用者的引用(通过"this"可以访问这个对象)其余参数则按照申明顺序在局部变量槽的索引中槽的复用:如果PC指令申明局部变量(j)已经超过了某个局部变量(a)的作用域...:每次运行期间把符号引用解析为直接引用(因为只有在运行时才知道到底指向哪个方法)方法返回地址执行方法后,有两种方式可以退出正常调用完成与异常调用完成正常调用完成: 遇到方法返回的字节码指令方法退出有时需要在栈帧中保存一些信息以恢复上一层方法的执行状态...,又递归调用频繁的创建栈帧,很快就会超过栈内存,从而导致StackOverflowError测试OOM在我们经常使用的hotSpot虚拟机中是不支持栈扩展的所以线程运行时不会因为扩展栈而导致OOM,只有可能是创建线程无法申请到足够内存而导致...,在逻辑上是连续的堆内存可以是固定的,也是扩展(-Xmx , -Xms)堆的内存结构 图片年轻代伊甸园区(eden)大部分对象都是伊甸园区被new出来的幸存to区( Survive to)幸存from区...: 永久代,慢慢退化,去永久代,将静态常量池移到堆中(字符串常量池也是)JDK 8后 :无永久代,方法,静态常量池在元空间,元空间仍与堆不相连,但与堆共享物理内存,逻辑上可认为在堆中不存在垃圾回收,关闭
如果线程正在执行的是一个 Java 方法,计数器记录的是正在执行的字节码指令的地址;如果正在执行的是 Native 方法,则计数器的值为空。 ...此外,栈的大小可以是固定的,也可以是动态扩展的,若虚拟机栈可以动态扩展(大多数虚拟机都可以),但扩展时无法申请到足够的内存(比如没有足够的内存为一个新创建的线程分配栈空间时),则抛出 OutofMemoryError...而且,Java堆在实现时,既可以是固定大小的,也可以是可拓展的,并且主流虚拟机都是按可扩展来实现的(通过-Xmx(最大堆容量) 和 -Xms(最小堆容量)控制)。...空闲列表:如果Java堆中内存并不规整,那么虚拟机就需要维护一个列表,记录哪些内存块是可用的,以便在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录。 ...如果是内存泄露,可以进一步通过工具查看泄露对象到GC Roots的引用链,比较准确地定位出泄露代码的位置。如果是内存溢出,可以调大虚拟机堆参数,或者从代码上检查是否存在某些对象生命周期过长的情况。
领取专属 10元无门槛券
手把手带您无忧上云