武汉PHP培训
达内武汉民大中心

15827352908

热门课程

常见Java面试题

  • 时间:2017-12-25 09:16
  • 发布:互联网
  • 来源:互联网

    Java内存分配有那些?

    武汉PHP培训说分为:

    寄存器:JVM内部虚拟寄存器,存取速度非常快,程序不可控制.

    栈区:保存局部变量的值,包括:1.用来保存基本数据类型的值2.保存类的实例,即堆区对象的引用(指针),也可以用来保存加载方法时的帧.

    堆:用来存放动态产生的数据,比如new出来的对象.注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法.因为同一个类的对拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象把成员复制一次.

    常量池:JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合.包括直接常量(基本类型 String)和其他类型 方法 字段的符号引用 池中的数据和数组一样通过索引访问 由于常量池包含了一个类型所有的其他类型.

    代码段:用来存放从硬盘上读取的源程序代码.

    数据段:用来存放static 定义的静态成员.

    1.png

    http://blog.csdn.net/OyangYujun/article/details/41173747

    java中垃圾回收机制:

    垃圾回收的意义

    在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃.当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用.事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片.由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片.碎片是分配给对象的内存块之间的空闲内存洞.碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象.

    垃圾回收能自动释放内存空间,减轻编程的负担.这使Java 虚拟机具有一些优点.首先,它能使编程效率提高.在没有垃圾回收机制的时候,可能要花许多时间来解决一个难懂的存储器问题.在用Java语言编程的时候,靠垃圾回收机制可大大缩短时间.其次是它保护程序的完整性, 垃圾回收是Java语言安全性策略的一个重要部份.

    垃圾回收的一个潜在的缺点是它的开销影响程序性能.Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象.这一个过程需要花费处理器的时间.其次垃圾回收算法的不完备性,早先采用的某些垃圾回收算法就不能保证100%收集到所有的废弃内存.当然随着垃圾回收算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解.

    垃圾回收有以下的几个特点:

    (1)垃圾收集发生的不可预知性:由于实现了不同的垃圾回收算法和采用了不同的收集机制,所以它有可能是定时发生,有可能是当出现系统空闲CPU资源时发生,也有可能是和原始的垃圾收集一样,等到内存消耗出现极限时发生,这与垃圾收集器的选择和具体的设置都有关系.

    (2)垃圾收集的精确性:主要包括2 个方面:(a)垃圾收集器能够精确标记活着的对象;(b)垃圾收集器能够精确地定位对象之间的引用关系.前者是完全地回收所有废弃对象的前提,否则就可能造成内存泄漏.而后者则是实现归并和复制等算法的必要条件.所有不可达对象都能够可靠地得到回收,所有对象都能够重新分配,允许对象的复制和对象内存的缩并,这样就有效地防止内存的支离破碎.

    (3)现在有许多种不同的垃圾收集器,每种有其算法且其表现各异,既有当垃圾收集开始时就停止应用程序的运行,又有当垃圾收集开始时也允许应用程序的线程运行,还有在同一时间垃圾收集多线程运行.

    (4)垃圾收集的实现和具体的JVM 以及JVM的内存模型有非常紧密的关系.不同的JVM 可能采用不同的垃圾收集,而JVM 的内存模型决定着该JVM可以采用哪些类型垃圾收集.现在,HotSpot 系列JVM中的内存系统都采用先进的面向对象的框架设计,这使得该系列JVM都可以采用最先进的垃圾收集.

    (5)随着技术的发展,现代垃圾收集技术提供许多可选的垃圾收集器,而且在配置每种收集器的时候又可以设置不同的参数,这就使得根据不同的应用环境获得最优的应用性能成为可能.

    java中error和exception的区别:

    Error类和exception类的父类都是throwable类,他们的区别是:

    error类一般是指与虚拟机相关的问题,如系统崩溃 ,虚拟机错误,内存空间不足,方法调用栈溢等.对于这类错误的导致的应用程序中断,仅靠程序无法恢复和预防,遇到这样的错误,建议让程序终止.

    Exception类表示程序可以处理的异常,可以捕获这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常.

    Exception类又分为运行时异常和受检查的异常,运行时异常,编译能通过但运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止.而受检查的异常,要么用try...catch捕获,要么用throws子句声明抛出,交给他的父类处理,否则编译不会通过.

    字节流和字符流有什么区别?

    程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件.

    字符流处理的单元为2个字节的Unicode字符

    字符流(一个字符占两个字节)

    字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

    字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容.

    字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向IO设别写入或读取字符串提供了一点点方便. 字符向字节转换时,要注意编码的问题,因为字符串转成字节数组,

    ==与equlas有什么区别?

    ==可以判断基本数据类型值是否相等,也可以判断两个对象指向的内存地址是否相同,也就是说判断两个对象是否是同一个对象,Equlas通常用来做字符串比较

    拦截器与过滤器的区别?

    拦截器是基于java的反射机制的,而过滤器是基于函数回调.

    拦截器不依赖与servlet容器,过滤器依赖与servlet容器.

    拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用.

    拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问.

    在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被.

    SESSION, COOKIE区别

    session数据放在服务器上,cookie则放在客户浏览器上.cookie不太安全,因为可以分析出本地cookie,并进行cookie欺骗,考虑安全应使用session.session会在一定时间内保存在服务器上,当访问增多时,会比较占用服务器的性能,考虑减轻服务器压力则应该使用cookie.单个cookie保持的数据不超过4k,很多浏览器都限制要给站点最多保存20个cookie.

    简述Servlet中请求的转发与重定向的区别.

    转发:forward ,内部请求转发,前一个程序进行请求,后一个程序用来返回响应

    请 求转发发生在服务器端,由服务器(比如servlet)控制.

    请求转发过程在同一个请求当中完成,只会返回一个响应.

    请求转发使用RequestDispatcher对象的forward()或include()方法
武汉PHP培训
    请求转发相对快:因为请求转发过程在同一请求中.

    重定向:redirect,服务端发送给客户端一个重定向的临时响应头,这个响应头包含重定向之后的url,客户端用新的URL重新向服务器发送一个请求

    重定向发生在客户端,由客户(通常是浏览器)控制.

    重定向过程则发生在两个不同的请求中,会返回两个不同响应.

    重定向则使用HttpServletResponse对象的sendRedirect()方法.

    Java 中 sleep 方法和 wait 方法的区别?

    虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁.

    什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用.

    我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,

    例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,

    但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,

    这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化.

    需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的.

    例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口.

    如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口.

    假设有以下代码

    String s =''hello''String t = "hello"char c[] ={'h','e','l','l','o'}

    下列选项中返回false的语句中?

    A s.equals(t);

    B t.equals(c);

    C s==t

    D t.equals(new String(''hello''))

    解析 选B

    本篇文章是由武汉PHP培训为您呈现,希望给您带来更多更好的文章,喜欢的朋友们可以加微信公众号.

更多武汉PHP培训相关信息咨询,请扫描下方二维码

武汉PHP培训

马上预约七天免费试听课

姓名:

电话:

上一篇:Java并发编程
下一篇:Java中正则表达式分类及使用方法

达内教育集团总裁韩少云:双师模式的实践与思考

达内与广西教育学院携手签约,共建专业开启校企合作新阶段!

Java工程师岗位面试总结,看完了才发现知识不够用!

PHP中的堆是如何工作?

选择城市和中心
贵州省

广西省

海南省

有位老师想和您聊一聊