String,JVM,多线程面试知识点

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接口
       生命周期:新建——就绪——运行——阻塞——死亡

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章