String,StringBuffer,StringBulider区别
1、String是字符串常量,其他两者是变量
String拼接数值是不断创建对象和JVM(GC)回收的过程,用“+”拼接,StringBuilder用append()方法
从执行速度来说:StringBuilder>StringBuffer>String
注意:String str1="a"+"b"比StringBuilder sb=new StringBuilder().append("a").append("b");速度快,因为Str1等同于str1="ab"
2、StringBuffer中很多方法带有synchronized关键字修饰,所以是线程安全的,StringBuilder方法没有synchronized关键字修饰,所以是线程不安全的
总结:
String:适用于少量字符串操作
StringBuffer:适用于多线程大量字符串操作
StringBulider:适用於单线程大量字符串操作
3、数据类型:
基本数据类型:byte,short,int,long,char,float,double,boolean
引用数据类型:类类型,接口类型和数组
4、java中参数传递是值传递还是引用传递?
程序运行都是在栈中执行,因此传递的是基本数据类型和对象的引用,不是对象本身。在运行栈中,传递的是基本数据类型和对象引用的值
5、JVM:
栈(stack):运行时的单位。存放的是基本数据类型和堆对象的引用(一个对象只对象大小为4byte的引用)
栈的大小通过-Xss来控制,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。
常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。
-Xss规定了每个线程堆栈的大小。一般情况下256K是足够了。影响了此进程中并发线程数大小。
堆(heap):存储的单位。存放的是对象(是动态变化的)
new创建的对象的内存都在堆中分配,大小通过-Xmx(最大值)和-Xms(最小值)控制
方法区(method):保存方法代码(编译后的java代码)和字符表。存放了要加载的类信息,方法信息,静态变量,final类型的常量、属性。
JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
本地方法栈(java中的jni调用):用于支持native方法的执行,存储了每个native方法调用的状态。
垃圾回收机制:GC
堆里聚集了应用程序创建的对象,JVM有对应的new,newArray然而没有对应的delete,free指令。所以java的对象回收都是通过GC,GC除了回收内存之外,还有重要的工作就是内存压缩
对象引用的类型分为:强引用,软引用,弱引用和虚引用
强引用:就是平时写的代码,不会被垃圾回收
软引用:作为缓存来使用,回收机制会根据内存使用情况选择是否被回收
弱引用:作为缓存来使用,在进行垃圾回收时,一定会被回收,因为它只存在于垃圾回收机制生命周期里
GC类型:Scavenge GC和Full GC
Scavenge GC:
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。
然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。
因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
Full GC:
对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。
在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。
有如下原因可能导致Full GC:
1· 年老代(Tenured)被写满
2· 持久代(Perm)被写满
3· System.gc()被显示调用
4·上一次GC之后Heap的各域分配策略动态变化
总结:
堆栈分离的原因:
1、栈代表处理逻辑,堆代表数据。
2、栈和堆的分离,使得堆中的数据被多个栈共享(多线程访问同一个对象),内存共享,节省空间。
3、栈只能向上增长,堆中的对象根据需要动态增长,从而实现了动态增长,栈中只需记录堆的地址即可。
4、面向对象就是堆和栈的完美结合。比如:对象的属性就是数据,放在堆里。对象的方法(行为)就是运行逻辑,放在栈中。
声明一个Object对象(即Object ob=new Object())需要在堆内的空间大小为4byte(栈引用大小)+8byte(对象堆中大小)
6、java对象的生命周期:
创建——应用——不可见——不可达——收集——终结——对象空间重分配
7、在Hibernate中,持久化对象在操作过程中可以分为三个时期,这三个时期是与Session的周期相关的,因为Hibernate中的操作都是基于Session完成的。
所以Session对象的生命周期也关系着持久化对象的生命周期。
持久化对象的三种生命周期分别是:
1、瞬时态(Transient):刚创建的对象,还没有被session管理
2、持久态(Persistent):被session管理,并且对应数据库有一条数据
3、脱管态(Detached):脱离session管理
8、线程:
创建线程的方法:继承Thread类和实现Runnable接口
生命周期:新建——就绪——运行——阻塞——死亡