1.StringBuilder、String、StringBuffer
buffer: 缓冲 append :附加 增补
String类是不可变类,任何对String的改变都 会引发新的String对象的生成
StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。
StringBuffer和StringBuilder类的区别也是如此,他们的原理和操作基本相同,区别在于StringBufferd支持并发操作,线性安全的,适 合多线程中使用。StringBuilder不支持并发操作,线性不安全的,不适合多线程中使用。新引入的StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。
StringBuilder的操作速度很快,在单线程情况下使用很好。
2.java虚拟机及其内部结构
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码,16进制),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
JAVA虚拟机运行时数据区:
栈:
存储局部变量的地方。每个线程都会分到一部分栈的空间。
栈帧:每个线程占用的一个空间,因为多个线程占用多个空间,每片空间就叫一个栈帧。
每个栈帧中都包含以下四个部分:
1.方法出口,即执行完当前线程后,回到main线程或者其他线程。
2.操作数栈:存储数据
3.局部变量表:给数据分配的存储空间
4:动态链表
程序计数器:
目的是为了记录当前线程的程序运行到的位置。该线程被中断后,记录下程序执行到的位置。再恢复时继续在这里执行就行。
堆:
堆中存储的是对象。分为老年代和年轻代,老年代存储空间占了总的2/3。
gc :garbage collect 垃圾收集
堆中的垃圾对象:
所存在的线程结束了,其数据也都销毁了,其指针也都销毁了。没用了,留在堆浪费内存。
系统如何判断垃圾对象(minor gc)?
答:可使用可达性算法,从GC root根(对象)出发,寻找它的引用。当gc root根没了,或者说是,原来被引用的东西,现在没人使用他们了,他们就变成了垃圾对象。
对象每经历一次minor gc,即逃过以此垃圾清理,GC 分代年龄就加1.
从上图可以看出,一个对象,即objiect包含的不仅仅时在java代码表面上看起来那么简单,除了能见到的数据和方法之外。还有Klass Pointer(指明时哪个类的对象)、GC分代年龄等等关键信息。
方法区:
方法区存放的主要是Class,而堆存放的主要是实例化对象。栈中存放的是对象的引用reference。
Java本地方法
图中的本地方法栈的作用:
本地方法就是方法名前有native标记。意义是通过该java语句去调用c语言的方法。本地方法栈就是存储本地方法的信息的。java创建线程时就需要调用本地方法,用c语言去创建操作系统线程。