Java软件开发常见面试题(一)

1、如何理解垃圾回收?

垃圾回收是Java语言的一大特性,方便了编程,是以消耗性能为代价的;在Java虚拟机(JVM)中,有一个垃圾回收器,它的作用就是查找和回收没用的对象,以便让JVM更有效的使用内存;尽可能保证可用内存的使用效率,让可用内存得到高效的管理,程序员可以影响垃圾回收的执行,但是不能控制。

垃圾回收器的运行时间程序员是无法决定的,由JVM决定,运行时也是间接执行的,虽然可以通过System.gc( )来强制回收垃圾,但是在该命令执行后无法保证JVM会立即响应执行,下达命令后,会在短期内执行程序员的请求,但是JVM会在感到内存紧缺的时候去执行垃圾回收操作。

垃圾回收过于频繁会导致性能下降,过于稀疏会导致内存紧缺,但是这个问题JVM会自己控制好,不用程序员去控制,这也是Java语言的一个好处;但是有时候会在短期内使用掉大量内存,而且这些对象在短暂使用后就不用了,这时候有必要下达一条强制回收命令,以便有更多可用的物理内存。

JVM判断一块内存是否符合垃圾回收器收集的标准:

1、给对象赋了空值null,而且后面没有使用过;

2、给对象赋予了新值,即重新分配了内存空间。

2、如何理解线程安全?

线程安全就是在多线程访问时,采用了加锁机制,当一个线程访问该类的数据时,其他线程不能进行访问,直到这个线程访问完毕,其他线程才可以继续读取,不会出现数据不一致或数据污染。

如果代码所在的进程中有多个线程同时在运行,而这些线程可能会同时访问这段代码,如果每次运行的结果和单线程是一样的,而且其他的值也和预期是一样的,就是线程安全。

如:一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。        在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而Size=1;            如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 ,所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。看看ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了。

线程安全性不是一个非真即假的命题。比如: Vector 的方法都是同步的,并且 Vector 明确地设计为在多线程环境中工作。但是它的线程安全性是有限制的,即在某些方法之间有状态依赖(类似地,如果在迭代过程中 Vector 被其他线程修改,那么由 Vector.iterator() 返回的 iterator会抛出ConcurrentModifiicationException异常。对于 Java 类中常见的线程安全性级别,没有一种分类系统可被广泛接受,不过重要的是在编写类时尽量记录下它们的线程安全行为。

Bloch 给出了描述五类线程安全性的分类方法:不可变、线程安全、有条件线程安全、线程兼容和线程对立。

3、用户很多时,怎么对服务器进行优化?(servlet+jsp部分)

将在一段时间内不活跃的用户进行钝化,将用户对象序列化到本地磁盘,这样就缓解了内存压力;当用户再次活跃时,再活化就行了!

钝化:是将session内存中的对象持久化(序列化)(实现序列化接口)到磁盘;

活化:就是将磁盘上的对象再次恢复到session内存中

(1)钝化与活化的监听器HttpSessionActivationListener

可以通过配置文件 指定对象钝化时间 --- 对象多长时间不用被钝化

在META-INF下创建一个context.xml,内容如下:

<Context>

<!-- maxIdleSwap:session中的对象多长时间不使用就钝化 -->

<!-- directory:钝化后的对象的文件写到磁盘的哪个目录下,配置钝化的对象文件在            work/catalina/localhost/钝化文件 -->

<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">

<Store className="org.apache.catalina.session.FileStore" directory="bonnie" />

</Manager>

</Context>

@Override

public void sessionWillPassivate(HttpSessionEvent se) {

System.out.println("被钝化。。。");

}

@Override

public void sessionDidActivate(HttpSessionEvent se) {

System.out.println("被活化。。。");

}

        当访问指定的servlet工程时,在设置的时间到了以后,就会出现“被钝化”;然后再访问工程下的任意一个文件,就可以被活化。

被钝化到work/catalina/localhost/的文件

时间: 2024-11-10 14:47:35

Java软件开发常见面试题(一)的相关文章

Java后台开发常见面试题

八种基本数据类型的大小,以及他们的封装类 整数型: byte 1个字节 -128~127 封装类:Byte short 2个字节 -32768~32767 Short Int 4个字节 -2147483648~2147483647 Integer long 8个字节 -2的63方~2的63次方-1 Long 浮点型: float 4个字节 单精度 Float Double 8个字节 双精度 Double 布尔类型: boolean 4个字节 true或false Boolean 字符类型: ch

Java 并发基础常见面试题总结

Java 并发基础常见面试题总结 1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程. 如下图所示,在 windows 中通过查看任务管理器的方式,我们就可以清楚看到 window 当前运行的进程(.exe 文件的运行). 1.2

2019年Java后端工程师常见面试题和感想

来新公司有5个月了,从第二个月开始就参与公司后端工程师的面试工作了,包括校招在内,面试超过100个(包括40个校招的终面)应聘者了,应聘者中有超过10年的技术经理,有6年以上的高级开发,有3到5年的中级开发,有刚毕业的初级开发,当然还有未毕业的硕士生本科生,有入职公司的,也有外包公司来参与公司项目的,总之,各种水平层次的都有,每个人的素质也参差不齐,今天就分两个部分讲一讲,一个是作为技术面试官,我比较喜欢问的问题,二是面试后的一些感想,希望对大家有帮助,同时也是要鞭策自己. 一,常见的面试题 这

全网阅读过20k的Java集合框架常见面试题总结!

本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Star!). 文末有我的公众号,公众号里有我最新整理的Java学习资料,免费分享. 这么好的文章,一定好先赞后看!!!建议养成这个好习惯!!爱你们!?? 剖析面试最常见问题之Java集合框架 当了会标题党,这是第一次,后面还有很多次!不过这文章全网阅读肯定是超过 20 k 的,而且经过了很多同行的优化,

java程序员常见面试题

一.基础简答题 1.      super()与this()的区别? super() 调用父类的无参构造方法,this()调用本身类无参构造方法. 2.      作用域public,protected,private,以及不写时的区别? public公共修饰的变量,在其他类都可以访问到 protected 保护 同一个包子类访问 private 私有 只有这个类访问 不写 package 同一个包访问 3.      在JAVA中,如何跳出当前的多重嵌套循环? break:continue跳出

Java集合框架常见面试题

剖析面试最常见问题之Java集合框架 说说List,Set,Map三者的区别? Arraylist 与 LinkedList 区别? 补充内容:RandomAccess接口 补充内容:双向链表和双向循环链表 ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢? 说一说 ArrayList 的扩容机制吧 HashMap 和 Hashtable 的区别 HashMap 和 HashSet区别 HashSet如何检查重复 HashMap的底层实现 JDK1.8

Java中的常见面试题

1.sleep()和wait()的区别: 两者都可以控制线性进程,阻塞进程.区别是: -----|sleep():释放CPU,不释放资源(锁).可以通过指定时间来使它自动醒来,时间不到只能调用iterreput()来强行打断: -----|wait():释放CPU,释放资源(锁).必须在有锁的前提下才可以使用,也就是同步代码块.同步方法,使用时:锁.wait();

JAVA线程操作常见面试题 包括不使用内部类对多个线程加减1

class ManyThreads2 { private int j = 0; public synchronized void inc() { j++; System.out.println(Thread.currentThread().getName() + "inc" + j); } public synchronized void dec() { j--; System.out.println(Thread.currentThread().getName() + "d

Java中面向对象常见面试题

一.成员变量与局部变量的区别1.在类中位置不同:成员变量:在类中方法外定义.局部变量:在方法声明上或在方法定义中.2.在内存中位置不同:成员变量:堆内存.局部变量:栈内存.3.生存周期不同:成员变量:随着类的加载而加载,随着类的消失而消失.局部变量:随着方法调用而存在,随着方法调用完毕而消失.4.初始化值不同:成员变量:由系统默认初始化.对于成员变量,可以不给初始化值,由系统给,然后显示初始化.局部变量:局部变量在使用之前必须初始化,否则无法使用.二.有一个学生类Student,里面有一些属性,