jvm
文章平均质量分 59
jvm个人笔记
时越zz
努力
展开
-
方法返回地址与一些附加信息
**存放调用该方法的pc寄存器的值。**一个方法的结束,有两种方式:正常执行完成出现未处理的异常,非正常退出无论通过哪种方式退出,在方法退出后都返回到该方法被调用的位置.方法正常退出时,调用者的pc计数器的值作为返回地址,即调用该方法的指令的下一条指令的地址。而通过异常退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。当一个方法开始执行后,只有两种方式可以退出这个方法:执行引擎遇到任意一个方法返回的字节码指令(return),会有返回值传递给上层的方法调用者,简称正常完成出口原创 2022-05-10 16:13:50 · 159 阅读 · 0 评论 -
方法调用:解析与分配
在JVM中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关链接静态链接当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期确定,且运行期保持不变时,这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接动态链接如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用的方法的符号转换为直接引用,由于这种引用转换过程具备动态性,因此也被称之为动态链接。绑定机制对应的方法的绑定机制为:早期绑定(Early Binding)和晚期绑定(Late Bin原创 2022-05-10 16:09:42 · 130 阅读 · 0 评论 -
动态链接原理
动态链接动态链接、方法返回地址、附加信息 : 有些地方被称为帧数据区每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking)。比如:invokedynamic指令在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Reference)保存在class文件的常量池里。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动原创 2022-05-10 16:00:58 · 492 阅读 · 0 评论 -
操作数栈原理
操作数栈操作数栈:Operand Stack每一个独立的栈帧除了包含局部变量表以外,还包含一个后进先出(Last - In - First -Out)的 操作数栈,也可以称之为 表达式栈(Expression Stack)操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)和 出栈(pop)某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈。使用它们后再把结果压入栈比如:执行复制、交换、求和等操作操作数栈,主要用于保存计算过程的中间结果,同时作原创 2022-05-10 15:55:10 · 221 阅读 · 0 评论 -
局部变量表
局部变量表局部变量表:Local Variables,被称之为局部变量数组或本地变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。原创 2022-05-04 23:09:03 · 1381 阅读 · 0 评论 -
虚拟机栈以及栈原理
虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。有不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?为什么?首先栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里原创 2022-05-04 23:03:13 · 393 阅读 · 0 评论 -
程序计数器
介绍JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数原创 2022-05-03 15:48:37 · 253 阅读 · 0 评论 -
JVM系统线程
线程线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行的执行。 在Hotspot JVM里,每个线程都与操作系统的本地线程直接映射。当一个Java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。Java线程执行终止后,本地线程也会回收。操作系统负责所有线程的安排调度到任何一个可用的CPU上。一旦本地线程初始化成功,它就会调用Java线程中的run()方法。JVM系统线程如果你使用console或者是任何一个调试工具,都能看到在后台有许多线程在运行。这些后台线程不包括调用pu原创 2022-05-03 15:36:06 · 222 阅读 · 0 评论 -
运行时数据区概述
前言当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。我们通原创 2022-05-03 15:33:10 · 129 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用,终结器引用
Reference子类中只有终结器引用是包内可见的,其他3种引用类型均为public,可以在应用程序中直接使用强引用(StrongReference):最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用(SoftReference):在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收后还没有足够的内存,原创 2022-05-02 18:09:27 · 161 阅读 · 0 评论 -
垃圾回收的并行与并发,安全点与安全区域
并行在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行。并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。并行当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,我们称之为并行(Paralle1)。其实决原创 2022-05-02 18:03:42 · 230 阅读 · 0 评论 -
System.gc()的理解和内存溢出,内存泄漏,Stop The World
System.gc()在默认情况下,通过system.gc()或者Runtime.getRuntime().gc() 的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而system.gc() )调用附带一个免责声明,无法保证对垃圾收集器的调用。(不能确保立即生效)JVM实现者可以通过system.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,我们原创 2022-05-02 17:55:28 · 3255 阅读 · 0 评论 -
垃圾回收之清除阶段:分代收集算法,增量收集算法,分区算法
分代收集算法前面所有这些算法中,并没有一种算法可以完全替代其他算法,它们都具有自己独特的优势和特点。分代收集算法应运而生。分代收集算法,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的回收算法,以提高垃圾回收的效率。在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类原创 2022-05-02 17:40:13 · 187 阅读 · 0 评论 -
垃圾回收之清除阶段:标记-整理算法
背景复制算法的高效性是建立在存活对象少、垃圾对象多的前提下的。这种情况在新生代经常发生,但是在老年代,更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活对象较多,复制的成本也将很高。因此,基于老年代垃圾回收的特性,需要使用其他的算法。标记一清除算法的确可以应用在老年代中,但是该算法不仅执行效率低下,而且在执行完内存回收后还会产生内存碎片,所以JvM的设计者需要在此基础之上进行改进。标记-压缩(Mark-Compact)算法由此诞生。1970年前后,G.L.Steele、C.J.Che原创 2022-05-02 17:32:28 · 241 阅读 · 0 评论 -
垃圾回收之清除阶段:复制算法
背景为了解决标记-清除算法在垃圾收集效率方面的缺陷,M.L.Minsky于1963年发表了著名的论文,“使用双存储区的Lisp语言垃圾收集器CA LISP Garbage Collector Algorithm Using Serial Secondary Storage)”。M.L.Minsky在该论文中描述的算法被人们称为复制(Copying)算法,它也被M.L.Minsky本人成功地引入到了Lisp语言的一个实现版本中。核心思想将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将正在使用原创 2022-05-02 17:27:35 · 139 阅读 · 0 评论 -
垃圾回收之清除阶段:标记-清除算法
清除阶段当成功区分出内存中存活对象和死亡对象后,GC接下来的任务就是执行垃圾回收,释放掉无用对象所占用的内存空间,以便有足够的可用内存空间为新对象分配内存。目前在JVM中比较常见的三种垃圾收集算法是标记一清除算法(Mark-Sweep)复制算法(copying)标记-压缩算法(Mark-Compact)标记-清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并并应用于Lisp语言。标记-清除算法执行过程当堆中的有效内存空原创 2022-05-02 17:03:52 · 418 阅读 · 0 评论 -
对象的finalization机制
对象的finalization机制Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法。finalize() 方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。注意永远不要主动调用某个对象的finalize()方法I应该交给垃圾回收机制调用。理由包括下原创 2022-05-02 16:56:46 · 172 阅读 · 0 评论 -
垃圾回收之标记阶段-可达性分析算法
可达性分析算法可达性分析算法:也可以称为 根搜索算法、追踪性垃圾收集相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和执行高效等特点,更重要的是该算法可以有效地解决在引用计数算法中循环引用的问题,防止内存泄漏的发生。相较于引用计数算法,这里的可达性分析就是Java、C#选择的。这种类型的垃圾收集通常也叫作追踪性垃圾收集(Tracing Garbage Collection)思路所谓"GCRoots”根集合就是一组必须活跃的引用。基本思路:可达性分析算法是以根对象集合(GCRoots原创 2022-04-30 20:15:18 · 431 阅读 · 0 评论 -
垃圾回收之标记阶段-引用计数算法
引用计数算法在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数算法(Reference Counting)比较简单,对每个对象原创 2022-04-30 16:48:33 · 142 阅读 · 0 评论 -
垃圾回收概述
什么是垃圾?垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。大厂面试题蚂蚁金服你知道哪几种垃圾回收器,各自的优缺点,重点讲一下cms和G1?JVM GC算法有哪些,目前的JDK版本采用什么回收算法?G1回收器讲下回收过程GC是什么?为什么要有GC?GC的两种判定方法?CMS收集器与G1收集器的特点百度说一下GC算法原创 2022-04-30 16:30:34 · 78 阅读 · 0 评论 -
GC日志分析
通过阅读Gc日志,我们可以了解Java虚拟机内存分配与回收策略。 内存分配与垃圾回收的参数列表-XX:+PrintGc输出GC日志。类似:-verbose:gc-XX:+PrintGcDetails输出Gc的详细日志-XX:+PrintGcTimestamps 输出Gc的时间戳(以基准时间的形式)-XX:+PrintGCDatestamps 输出Gc的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC在进行Gc的前后打印出堆的信原创 2022-04-30 09:55:32 · 201 阅读 · 0 评论 -
垃圾回收器总结
截止JDK1.8,一共有7款不同的垃圾收集器。每一款的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。HotSpot虚拟机在JDK7/8后所有收集器及组合如下图怎么选择垃圾回收器Java垃圾收集器的配置对于JVM优化来说是一个很重要的选择,选择合适的垃圾收集器可以让JVM的性能有一个很大的提升。怎么选择垃圾收集器?优先调整堆的大小让JVM自适应完成。如果内存小于100M,使用串行收集器如果是单核、单机程序,并且没有停顿时间的要求,串行收集器如果是多CPU原创 2022-04-30 09:48:05 · 88 阅读 · 0 评论 -
G1回收过程
并发标记过程初始标记阶段:标记从根节点直接可达的对象。这个阶段是STW的,并且会触发一次年轻代GC。根区域扫描(Root Region Scanning):G1 GC扫描survivor区直接可达的老年代区域对象,并标记被引用的对象。这一过程必须在youngGC之前完成。并发标记(Concurrent Marking):在整个堆中进行并发标记(和应用程序并发执行),此过程可能被youngGC中断。在并发标记阶段,若发现区域对象中的所有对象都是垃圾,那这个区域会被立即回收。同时,并发标记过程中,会计算原创 2022-04-30 08:49:49 · 293 阅读 · 0 评论 -
G1回收过程-年轻代GC
年轻代GCJVM启动时,G1先准备好Eden区,程序在运行过程中不断创建对象到Eden区,当Eden空间耗尽时,G1会启动一次年轻代垃圾回收过程。YGC时,首先G1停止应用程序的执行(stop-The-Wor1d),G1创建回收集(Collection Set),回收集是指需要被回收的内存分段的集合,年轻代回收过程的回收集包含年轻代Eden区和Survivor区所有的内存分段。然后开始如下回收过程:第一阶段,扫描根根是指static变量指向的对象,正在执行的方法调用链条上的局部变量等。根引用连原创 2022-04-30 08:49:08 · 448 阅读 · 0 评论 -
G1垃圾回收器的回收过程
回收过程G1GC的垃圾回收过程主要包括如下三个环节:年轻代GC(Young GC)老年代并发标记过程(Concurrent Marking)混合回收(Mixed GC)(如果需要,单线程、独占式、高强度的FullGC还是继续存在的。它针对GC的评估失败提供了一种失败保护机制,即强力回收。)顺时针,young gc->young gc+concurrent mark->Mixed GC顺序,进行垃圾回收。应用程序分配内存,当年轻代的Eden区用尽时开始年轻代回收过程;G1的年轻代原创 2022-04-29 18:58:51 · 1026 阅读 · 0 评论 -
G1回收器:区域化分代式
G1回收器既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First(G1)?原因就在于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。G1(Garbage-First)垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一。与此同时,为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause t原创 2022-04-29 18:44:40 · 374 阅读 · 1 评论 -
CMS回收器:低延迟
CMS回收器在JDK1.5时期,Hotspot推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器:CMC(Concurrent-Mark-Sweep)收集器,这款收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作。CMS收集器的关注点是**尽可能缩短垃圾收集时用户线程的停顿时间。**停顿时间越短(低延迟)就越适合与用户交互的程序,良好的响应速度能提升用户体验。目前很大一部分的Java应用集中在互联网站或者B/S系统的服务端上,这类应用尤其原创 2022-04-29 17:12:35 · 427 阅读 · 1 评论 -
Parallel回收器:吞吐量优先
Parallel回收器HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外,Parallel Scavenge收集器同样也采用了复制算法、并行回收和"Stop the World"机制。那么Parallel 收集器的出现是否多此一举?和ParNew收集器不同,ParallelScavenge收集器的目标则是达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集器。自适应调节策略也是Paralle1 Scavenge与ParNew一个重要区别。高吞吐量则原创 2022-04-29 16:52:18 · 219 阅读 · 0 评论 -
ParNew回收器:并行回收
ParNew回收器如果说serialGC是年轻代中的单线程垃圾收集器,那么ParNew收集器则是serial收集器的多线程版本。 Par是Parallel的缩写,New:只能处理的是新生代ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何区别。ParNew收集器在年轻代中同样也是采用复制算法、"stop-the-World"机制。ParNew 是很多JVM运行在Server模式下新生代的默认垃圾收集器。对于新生代,回收次数频繁,使用并行方式高效。原创 2022-04-29 16:40:37 · 231 阅读 · 0 评论 -
Serial回收器:串行回收
Serial回收器Serial收集器是最基本、历史最悠久的垃圾收集器了。JDK1.3之前回收新生代唯一的选择。Serial收集器作为HotSpot中client模式下的默认新生代垃圾收集器。Serial收集器采用复制算法、串行回收和"stop-the-World"机制的方式执行内存回收。除了年轻代之外,Serial收集器还提供用于执行老年代垃圾收集的Serial old收集器。Serial old收集器同样也采用了串行回收和"stop the World"机制,只不过内存回收算法使用原创 2022-04-29 16:29:54 · 136 阅读 · 0 评论 -
查看默认垃圾收集器
-XX:+PrintcommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID原创 2022-04-29 15:35:36 · 108 阅读 · 0 评论 -
垃圾回收器发展史与7种经典的垃圾收集器
垃圾回收器发展史标题有了虚拟机,就一定需要收集垃圾的机制,这就是Garbage Collection,对应的产品我们称为Garbage Collector。- 1999年随JDK1.3.1一起来的是串行方式的serialGc,它是第一款GC。ParNew垃圾收集器是Serial收集器的多线程版本- 2002年2月26日,Parallel GC和Concurrent Mark Sweep GC跟随JDK1.4.2一起发布·- Parallel GC在JDK6之后成为HotSpot默认GC。- 201原创 2022-04-29 15:34:41 · 447 阅读 · 0 评论 -
评估GC的性能指标
吞吐量:运行用户代码的时间占总运行时间的比例(总运行时间 = 程序的运行时间 + 内存回收的时间)垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例。暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。收集频率:相对于应用程序的执行,收集操作发生的频率。内存占用:Java堆区所占的内存大小。快速:一个对象从诞生到被回收所经历的时间。吞吐量、暂停时间、内存占用 这三者共同构成一个“不可能三角”。三者总体的表现会随着技术进步而越来越好。一款优秀的收集器通常最多同时满足其中的两项。 这.原创 2022-04-29 15:25:07 · 284 阅读 · 0 评论 -
带你从不同角度了解GC分类
垃圾回收器概述垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性 语法层面:Lambda表达式、switch、自动拆箱装箱、enum API层面:Stream API、新的日期时间、Optional、String、集合框架 底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池原创 2022-04-29 08:53:41 · 235 阅读 · 0 评论 -
字符串常量池(intern() 的使用)
intern() 方法的说明intern是一个native方法,调用的是底层C的方法字符串常量池最初是空的,由String类私有地维护。在调用intern方法时,如果池中已经包含了由equals(object)方法确定的与该字符串内容相等的字符串,则返回池中的字符串地址。否则,该字符串对象将被添加到池中,并返回对该字符串对象的地址。如果不是用双引号声明的String对象,可以使用String提供的intern方法:intern方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入原创 2022-04-26 17:33:31 · 324 阅读 · 0 评论 -
带你深入理解字符串拼接的底层原理
结论常量与常量的拼接结果在常量池,原理是编译期优化(在其编译期就将两个字符串拼接成为一个字符串)常量池中不会存在相同内容的字符串拼接前后,只要其中有一个是变量,结果就在堆中。变量拼接的原理是StringBuilder如果拼接的结果调用intern()方法,根据该字符串是否在常量池中存在,分为:1.如果存在,则返回字符串在常量池中的地址 2.如果字符串常量池中不存在该字符串,则在常量池中创建一份,并返回此对象的地址 public void test1(){ String s原创 2022-04-26 17:25:03 · 521 阅读 · 0 评论 -
String 的内存分配
在Java语言中有8种基本数据类型和一种比较特殊的类型String。这些类型为了使它们在运行过程中速度更快、更节省内存,都提供了一种常量池的概念。常量池就类似一个Java系统级别提供的缓存。8种基本数据类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种。1.直接使用双引号声明出来的String对象会直接存储在常量池中。比如:String info=“atguigu.com”; 2.如果不是用双引号声明的String对象,可以使用String提供的intern()方法。.原创 2022-04-26 17:12:08 · 1165 阅读 · 0 评论 -
带你看看 StringTable(字符串常量池)的基本特性以及底层结构
String的基本特性String:字符串,使用一对 “” 引起来表示String s1 = "atguigu" ; // 字面量的定义方式String s2 = new String("hello"); // new 对象的方式String被声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小String在jdk8及以前内部定义了final char va原创 2022-04-26 11:38:18 · 298 阅读 · 0 评论 -
类的主动使用和被动使用
主动使用创建类的实例。访问某个类或者接口的静态变量,或者对静态变量进行赋值。访问类的静态方法。反射。初始化一个类的子类。Java虚拟机启动时被标明启动类的类。被动使用除了以上情况其他使用Java类的方式都会被看作是对类的被动使用,都不会导致类的初始化。...原创 2022-04-23 16:46:47 · 232 阅读 · 0 评论 -
沙箱安全机制
例如:自己定义一个String类,在进行加载时,会优先使用启动类加载器加载JDK自带的类,这样可以保护核心源码,这就是沙箱安全机制。原创 2022-04-22 23:06:09 · 85 阅读 · 0 评论