Java笔试必考知识点合集九

1.full GC触发的条件

触发Full GC执行的情况有如下五种:
<1>. 旧生代(老年代)空间不足
      旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space 
       为避免以上两种状况引起的FullGC,调优时应尽量做到让对象在Minor GC(新生代)阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。
<2>. Permanet Generation(持久代)空间满
      PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满,在未配置为采用CMS GC的情况下会执行Full GC。如果经过Full GC仍然回收不了,那么JVM会抛出如下错误信息:
java.lang.OutOfMemoryError: PermGen space 
      为避免Perm Gen占满造成Full GC现象,可采用的方法为增大Perm Gen空间或转为使用CMS GC。
<3>. CMS GC时出现promotion failed和concurrent mode failure
     对于采用CMS进行旧生代GC的程序而言,尤其要注意GC日志中是否有promotion failed和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。
       promotion failed是在进行Minor GC时,survivor space放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;concurrent mode failure是在执行CMS GC的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。
       应对措施为:增大survivorspace、旧生代空间或调低触发并发GC的比率,但在JDK 5.0+、6.0+的版本中有可能会由于JDK的bug29导致CMS在remark完毕后很久才触发sweeping动作。对于这种状况,可通过设置-XX:CMSMaxAbortablePrecleanTime=5(单位为ms)来避免。
<4>. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
       这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。
       例如程序第一次触发MinorGC后,有6MB的对象晋升到旧生代,那么当下一次Minor GC发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB,则执行Full GC。
       当新生代采用PS GC时,方式稍有不同,PS GC是在Minor GC后也会检查,例如上面的例子中第一次Minor GC后,PS GC会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。

除了以上4种状况外,对于使用RMI来进行RPC或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过

- java-Dsun.rmi.dgc.client.gcInterval=3600000

来设置Full GC执行的间隔时间或通过-XX:+ DisableExplicitGC来禁止RMI调用System.gc。

<5>.在程序中直接调用System.gc。

2.jsp中静态include和动态include的区别

 动态 INCLUDE 用 jsp:include 动作实现 :
  
       它总是会检查所含文件中的变化 , 适合用于包含动态页面 , 并且可以带参数。各个文件分别先编译,然后组合成一个文件。
静态 INCLUDE 用 include 伪码实现 :
<%@ include file="included.htm" %> 
        定不会检查所含文件的变化 , 适用于包含静态页面 。先将文件的代码被原封不动地加入到了主页面从而合成一个文件,然后再进行翻译,此时不允许有相同的变量。 

以下是对 include 两种用法的区别  ;

  •     一 : 执行时间上 :
          <%@ include file="relativeURI"%> 是在翻译阶段执行
           在请求处理阶段执行 .
  •     二 : 引入内容的不同 :
            <%@ include file="relativeURI"%>   引入静态文本 (html,jsp), 在 JSP 页面被转化成 servlet 之前和它融和到一起 .
            引入执行页面或 servlet 所生成的应答文本 .

3.异常的结构

Java笔试必考知识点合集九_第1张图片

4.Java集合框架图

Java笔试必考知识点合集九_第2张图片

5.死锁

产生死锁的原因主要是: 
(1) 因为系统资源不足。 
(2) 进程运行推进的顺序不合适。 
(3) 资源分配不当等。 
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。 
产生死锁的四个必要条件: 
(1) 互斥条件:一个资源每次只能被一个进程使用。 
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 
这四个条件是 死锁的必要条件 ,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。 
死锁的解除与预防: 
   理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
情况下占用资源。因此,对资源的分配要给予合理的规划。

6.转发(Forward)和重定向(Redirect)

<1>.从地址栏显示来说 

  • forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
  • redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
<2>.从数据共享来说 
  • forward:转发页面和转发到的页面可以共享request里面的数据.
  • redirect:不能共享数据.
<3>.从运用地方来说 
  • forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
  • redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
<4>.从效率来说 
  • forward:高.
  • redirect:低.
本质区别  

一句话,转发是服务器行为,重定向是客户端行为。

两个动作的工作流程: 

转发过程:
  • 客户浏览器发送http请求----》
  • web服务器接受此请求--》
  • 调用内部的一个方法在容器内部完成请求处理和转发动作----》
  • 将目标资源 发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。 
重定向过程:
  • 客户浏览器发送http请求----》
  • web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》
  • 客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》
  • 服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。 


你可能感兴趣的:(牛客刷题)