java4 jvmm

来源:互联网 发布:在mac显示隐藏文件 编辑:程序博客网 时间:2024/04/29 05:44

32.Java中的NIO,BIO,AIO分别是什么

  • Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

  • Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

  • Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,


BIO、NIO、AIO适用场景分析:

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

33.序列化与反序列化

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据,实现Serializable接口

34.内存溢出与泄露:

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

35.Java内存模型及各个区域的OOM

每一个应用程序,都有一个JVM 

 jvm运行时内存分为两部分:线程共享内存和线程私有内存

线程共享内存包括:堆、方法区( ,java栈中包含 运行时常量池是在) 线程非共享内存包括:java栈,本地方法栈(但是是为了native方法准备的),PC程序寄存器 

我们的垃圾回收主要是针对 堆内存。不过,方法区的内存是永久区,一般也不需要考虑回收



36.出现OOM如何解决http://developer.51cto.com/art/201112/305696.htm

OOM for Heap此OOM是由于JVM中heap的最大值不满足需要,将设置heap的最大值调高即可调高heap的最大值,即-Xmx2G(数值)的值调大

OOM for GC此OOM是由于JVM在GC时,对象过多,导致内存溢出,建议调整GC的策略,在一定比例下开始GC而不要使用默认的策略,或者将新代和老代设置合适的大小,需要进行微调存活率


37.Java垃圾回收机制

标记——清除算法(Mark——Sweep)首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象标记清除之后会产生大量的非连续空间碎片

复制算法(Copying)

复制算法将可用的内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活的对象复制到另一块上,然后再把已使用过的内存空间一次清理掉。

分代收集算法(Generational Collection)

种算法只是根据对象的存活周期的不同将内存划分为几块,一般都划分为新生代和老年代,这样可以根据各个年代的特点采用最适当的收集算法。新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,因此选取复制算法,只需要付出少量存活对象的复制成本就可以完成收集;老年代中因为对象存活率高,没有额外的空间对它进行分配担保,就必须使用“标记——清除”或是“标记——整理”算法来进行回收。在之前的三种算法中已经有所描述

  内存的回收分为两类:

 新生代GC(Minor GC):以Minor GC非常频繁,一般回收速度也比较快

老年代GC(Major GC/Full GC)次Full GC的执行是以整个程序完全停滞作为代价的

38.Java类加载器及如何加载类(双亲委派)

JVM预定义的三种类型类加载器:

启动(Bootstrap)类加载器:是用本地代码实现的类装入器,开发者无法直接获取到启动类加载器的引用

标准扩展(Extension)类加载器它负责将< Java_Runtime_Home >/lib/ext或者由系统变量 java.ext.dir指定位置中的类库加载到内存中

系统(System)类加载器中指定的类库加载到内存中。

线程上下文类加载器。

双亲委派机制描述: 某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

委托机制的意义 — 防止内存中出现多份同样的字节码 


39.解析xml的4种方法详解

DOM(JAXP Crimson解析器) 由于它是

基于信息层次的,因而DOM被认为是基于

树或基于对象的


40.jdbc:Statement和PreparedStatement之间的区别

PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得,   preparedstatement支持批处

41内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,、栈溢出的原因


      一)、是否有递归调用


二)、是否有大量循环或死循环


三)、全局变量是否过多


四)、 数组、List、map数据是否过大


五)使用DDMS工具进行查找大概出现栈溢出的位置

0 0