Java基础资料整理

原创 2017年08月25日 17:20:44
 1、LocalThread的应用场景,数据传输适合用LocalThread么
2、linux的基本命令
   软链接、更改用户组和名、查看磁盘IO、查看内存、查看磁盘大小
3、网络安全(攻防有哪几种类型)
4、JVM的包括哪几种,画图表示,JVM的垃圾回收算法有哪几种
5、年轻代、持久代、老年代
6、session和cookie的区别,在分布式环境中,如何保持session共享,例如两台tomcat中,其中一台挂了,剩下的如何保持会话。
7、HashMap的数据结构,画图, ConcurrentHashMap做了哪些并发控制。


1、异常的种类,哪种必须要捕获,不捕获会怎么样
2、html的渲染顺序是什么
3、sql如何优化,(字段顺序属于老的优化方法)
4、抽象类和接口的区别
5、struct2的实现原理
6、spring的实现原理
7、索引如何使用
8、hashmap和hashtable的区别
9、常见的排序方法有哪些,讲讲如何实现的
10、注解有哪几种,如何使用
11、hibernate和Mybatis的区别
12、hadoop的实现机制
13、新生代、老年代存放的模式、画图说明
14、性能优化,java代码编写过程中的优化、sql优化、页面优化、内存优化、jvm调优
15、死锁的原因和解决方案
16、Hadoop中的map/reduce来处理这种海量数据
17、分而治之的思想
18、面向对象的算法思想
19、创建对象,除了直接new还有什么其他方法。
20、JSP的内置对象是什么
21、redis的数据类型有哪几种
22、StringBulider 和StringBuffer区别
23、设计模式,为什么要用单例模式
24、List、Set、Map包括哪些
25、用过的NoSQL数据库有哪些,主要应用在什么地方
26、IO的底层实现,读文件使用了什么方式,除了POI还有什么可以替代的么
27、private\public\-\protector类的访问权限是什么
28、数据结构有哪些
29、反射


答案:
1、LocalThread的应用场景,数据传输适合用LocalThread么
ThreadLocal存取的数据, 在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,
而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,
而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。


什么情况下使用Thread Local呢?

  • 一般来说,当某些数据以线程为作用域并且不同线程具有不同的数据副本时,就考虑用它了

  • 典型的例子是:Handler要获取当前线程的Looper,Looper的作用域为线程,每个线程具有不同的Looper.
最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等。

      private static void testThreadLocal(){
            new Thread(new Runnable(){
                  ThreadLocal<String> mLocal=new ThreadLocal<String>();
                  public void run() {
                        mLocal.set("balabala  ");
                        String s=mLocal.get();
                  System.out.println(s);  
                  }     
            }).start();
      }
      
      
      private static void testThreadLocal2(){
            final ThreadLocal<String>  local=new InheritableThreadLocal<>();
            local.set("balabala");
            new Thread(new Runnable(){
                  public void run() {
                        System.out.println(local.get());    
                  }     
            }).start();
      }



2、linux的基本命令
chgrp命令
该命令用于改变文件所属用户组
chgrp users -R ./dir # 递归地把dir目录下中的所有文件和子目录下所有文件的用户组修改为users

chown命令
该命令用于改变文件的所有者,与chgrp命令的使用方法相同,只是修改的文件属性不同

创建软链接     ln -s 源文件 目标文件。
硬链接ln src  dst,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。
 top、cpu 信息观察

vmstat
  vmstat 命令报告关于线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息

iostat -dx 显示磁盘扩展信息
df -lh   查看磁盘l大小

3、网络安全(攻防有哪几种类型)
1、读取攻击:嗅探攻击、侦察攻击(数据整理攻击、拨号式扫描/移位式扫描攻击、探测/扫描攻击)、直接进入攻击。
2、操作攻击:网络操纵攻击、应用程序操纵攻击(缓冲区溢出攻击、WEB应用程序攻击)
3、欺骗攻击:MAC欺骗攻击、IP欺骗攻击、传输欺骗攻击(TCP欺骗攻击、UDP欺骗攻击)、身份欺骗攻击、无赖设备攻击
4、泛洪攻击:MAC泛洪攻击、TCP SYN泛洪攻击、网络泛洪攻击(DDOS攻击、Smurf攻击:利用ICMP进行ping攻击)、应用程序泛洪攻击。
5、重定向攻击:IP重定向攻击、L2重定向攻击、传输重定向攻击

防火墙()、防毒墙、入侵防御(IPS)、统一威胁安全网关


4、JVM虚拟机运行时的内存模型、画图表示,JVM的垃圾回收算法有哪几种



引用计数法:
     对象每被引用一次,引用计数器就+1,对象引用释放,引用计算器-1,知道对象的引用计数微0,对象就被释放。但是但A和B循环引用的时候,就都不会被回收了。
root搜索算法:
     定义几个root,也就是这几个对象是不会被jvm虚拟机回收的,所以这些对象引用的对象都是在使用中的对象, 如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。


root对象有;
被启动类(bootstrap加载器)加载类和创建的对象
jvm运行时方法区类静态变量引用的对象
jvm运行时方法区常量池引用的对象
jvm当前运行线程中虚拟机栈变量表引用的对象
本地方法栈中jni引用的对象

这种算法就算互相引用,但是无法访问根,所以还是会被回收。

强引用关系,就是通过new方式创建的对象,并且显示关联的对象。

Java里面有四种应用关系,从强到弱分别为:

Strong Reference(强引用) –>Weak Reference (弱引用) -> Soft Reference(软引用) – > Phantom Reference(引用)

 

Strong Reference : 只有在引用对象root不可达的情况下才会标识为可回收,垃圾回收才可能进行回收

Weak Reference :即使在root算法中 其引用的对象root可达到,但是如果jvm堆内存 不够的时候,还是会被回收。

Soft Reference : 无论其引用的对象是否root可达,在响应内存需要时,由垃圾回收判断是否需要回收。

Phantom Reference :在回收器确定其指示对象可另外回收之后,被加入垃圾回收队列.


标记-清除法:把标记出来的需要回收的对象直接进行回收, 标记和清除阶段的效率不高,而且清除后回产生大量的不连续空间,这样当程序需要分配大内存对象时,可能无法找到足够的连续空间。
标记-清除-压缩:这个算法是在标记-清除的算法之上进行一下压缩空间,重新移动对象的过程。因为标记清除算法会导致很多的留下来的内存空间碎片,随着碎片的增多,严重影响内存读写的性能,所以在标记-清除之后,会对内存的碎片进行整理。最简单的整理就是把对象压缩到一边,留出另一边的空间。由于压缩空间需要一定的时间,会影响垃圾收集的时间。
适合在收集对象存活时间较长的老年代。



标记-清除-复制:把内存分配微两个空间,有个空间用来负责装载正常的对象信息,有个是用来垃圾回收用的。
对内存要求比较高,适用于短生存期对象, 用复制方法收集新生代,由于新生代中大部分对象(98%)都是朝生夕死的,所以两块内存的比例不是1:1(大概是8:1)


并行标记清除:作为有个线程进行, 并行的进行标记和清除。比如把需要标记的对象平均分配到多个线程之后,当标记完成之后,多个线程进行清除。
并发标记清除:应用程序和垃圾回收同时执行,


5、年轻代、老年代、持久代

年轻代;所有新生成的对象都是先放在年轻代中的,




在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。


老年代:在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:
用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,
例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。
持久代大小通过-XX:MaxPermSize=<N>进行设置。



6、session和cookie的区别,在分布式环境中,如何保持session共享,例如两台tomcat中,其中一台挂了,剩下的如何保持会话。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑安全应该使用session
3、session会在一定时间保存在服务器上,当访问增多,会比较占用服务器的性能,考虑到服务器减负性能方面,应当使用cookie
4、单个cookie保存的数据不能超过4K,很多浏览器会限制有个站点最多保存20个cookie

session是通过cookie来工作的,通过$_COOKIE['session']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,
从而获取到其他的信息。

在购物网站中通常将用户加入购物车的商品连同session_id记录到数据库中,当用户再次访问时,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。


session共享的问题:
1、粘性session
      粘性Session是指将用户锁定到某一个服务器上,比如上面说的例子,用户第一次请求时,负载均衡器将用户的请求转发到了A服务器上,如果负载均衡器设置了粘性Session的话,那么用户以后的每次请求都会转发到A服务器上,相当于把用户和A服务器粘到了一块,这就是粘性Session机制。

实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session。

upstream mycluster{
    #这里添加的是上面启动好的两台Tomcat服务器
    ip_hash;#粘性Session
     server 192.168.22.229:8080 weight=1;
     server 192.168.22.230:8080 weight=1;
}

2、服务器session复制
     任何有个服务器上的session发生改变,该节点会把这个session的所有内容序列化,然后广播给其他的节点,
不管其他服务器需不需要session。
缺点:会对网络负荷造成一定压力,如果session量大的话可能会造成网络堵塞,拖慢服务器性能。

实现方式:

① 设置tomcat ,server.xml 开启tomcat集群功能

② 在应用里增加信息:通知应用当前处于集群环境中,支持分布式
在web.xml中添加选项

3、session共享机制
     使用分布式缓存方案比如memcached、Redis,但是要求Memcached或redis必须是集群。

① 粘性session处理方式

原理:不同的 tomcat指定访问不同的主memcached。多个Memcached之间信息是同步的,能主从备份和高可用。用户访问时首先在tomcat中创建session,然后将session复制一份放到它对应的memcahed上。memcache只起备份作用,读写都在tomcat上。当某一个tomcat挂掉后,集群将用户的访问定位到备tomcat上,然后根据cookie中存储的SessionId找session,找不到时,再去相应的memcached上去session,找到之后将其复制到备tomcat上。

② 非粘性session处理方式

原理:memcached做主从复制,写入session都往从memcached服务上写,读取都从主memcached读取,tomcat本身不存储session
实现方式:用开源的msm插件解决tomcat之间的session共享:Memcached_Session_Manager(MSM)


4、session持久化到数据库
     ,拿出一个数据库,专门用来存储session信息。保证session的持久化。

优点:服务器出现问题,session不会丢失

缺点:如果网站的访问量很大,把session存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。

5、terracotta实现session复制

原理:Terracotta的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。可以看成是对第二种方案的优化。