String和java虚拟机

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语言去创建操作系统线程。




©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容