AI智能
改变未来

程序汪放水面试2年的Java女程序媛

面试官:你先介绍一下你的项目经验吧

补充建议

  1. 大家最好把项目中的最核心模块(就是最复杂的模块)讲出来,如电商项目 下单支付是最核心的  ,如果是内容管理系统,一般审批流业务是比较复杂的.
  2. 把核心的业务表,可以简单罗列出来,表与表的关系
  3. 如果你面试的是互联网公司,最好说些分布式的一些技术,面试官爱听,根据你面试公司的性质调整你回答问题的走向

面试官:oracle存储过程怎么调试

很多调试工具使用熟练度能看出程序员的经验是否靠谱

  • 首先在PL/SQL的左侧资源栏中展开Procedures项(图中位置1),然后再其上面的搜索框中(图中位置2)输入存过名称的关键词,按回车键搜索要调试的存过,不停的回车,直到找到想要调试的存过。

  • 找到想要调试的存过,左键单击选中该存过(图中位置1),然后右键单击该存过,从弹出菜单中选择“Test”项(图中位置2)。

  • 单击“Test”后,PL\\SQL会打开调试界面,图中位置1的按钮就是开始调试的按钮,在调试之前要填写存过的参数,位置2就是填写参数的地方,如果有多个参数,会有多行参数框,按参数名填写相应的参数即可。

  • 填写完参数,单击开始调试按钮后,调试的界面会发生一些变化。图中位置1的变化,说明存过已经处于执行状态,别人不能再编译或者执行。位置2的按钮就是执行按钮,单击这个按钮存过会执行完成或者遇到bug跳出,否则是不会停下来的,调试时不会用这个按钮的。位置3的按钮才是关键——单步执行,就是让代码一行一行的执行,位置4的按钮是跳出单步执行,等待下一个指令。

  • 单击“单步执行”,存过开始单步执行。界面中每一次执行的代码会高亮显示(图中位置1),如果想要看某个变量具体的值,就在位置2的地方输入该变量名,然后变量的值会显示在位置3的地方。

  • 调试的时候,每一次单步执行的时候要记一下执行代码的行数,图中位置3的数字就是当前执行代码的行数,就是第几行。如果过程单步执行到某行后,再单步执行的时候,存过就退出,那么错误就在该行的下一行。

  • 代码执行到24行,在往下执行时,直接转到exception的地方,也就是异常处理的部分。

  • 这说明我们代码中的错误在24和25行上,我们打开存过,浏览到24行和25行附近,发现25行和24行使用了两个变量,记住那两个变量。重新开始调试过程。

  • 单步的执行时候把刚才那两个变量名填写到变量查看框,一边观察变量值变化,一边单步执行,执行到24行的时候,发现一个变量已经有值了,而另一个变量的值为null。错误原因明朗了吧?就是变量没有赋值或者初始话,给该变量赋值后存过就不报错了。

面试官:接口是否开发过

程序汪喜欢问接口开发的经验

如果有银行,互联网接口开发经验最佳  比如 微信接口  微博的接口 支付宝的接口 或公司中 系统之间的接口调用

互联网项目接口联调非常重要,今天和这个系统对接明天又换了一家公司对接,联调的时候会遇到各种问题

  1. 编码问题gbk、utf-8 不说了最简单的也最容易乱码的问题
  2. 环境不通 ping 命令  curl 命令可以帮到你,联调前一代要检查下环境
  3. 数据格式转换异常,接口文档没看清楚给了错误的格式,粗心问题

面试官:项目中日志怎么打,规范等

考察点项目中用的日志框架

能说出日志框架能说多少尽量多说

详情如下

项目如果有用日志注解什么的更佳

面试官:Java集合排序工具

此题考察面试者常见工具类熟悉度

java集合的工具类Collections中提供了两种排序的方法,分别是:

  1. Collections.sort(List list)
  2. Collections.sort(List list,Comparator c)

第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下:
实体类:(基本属性,getter/setter方法,有参无参构造方法,toString方法)

可以说下这两接口的区别

接口comparable和

接口comparator的比较

Lambda表达式的基本排序,如果能把Java8流式语法的排序简单说非常好

面试官:Java内存溢出

1、堆内存溢出(outOfMemoryError:java heap space)

在jvm规范中,堆中的内存是用来生成对象实例和数组的。

如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。

当生成新对象时,内存的申请过程如下:

a、jvm先尝试在eden区分配新建对象所需的内存;

b、如果内存大小足够,申请结束,否则下一步;

c、jvm启动youngGC,试图将eden区中不活跃的对象释放掉,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;

d、Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;

e、 当OLD区空间不够时,JVM会在OLD区进行full GC;

f、full GC后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”:

outOfMemoryError:java heap space

代码举例:

/** * 堆内存溢出 * * jvm参数:-Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m * */public class MemoryLeak {    private String[] s = new String[1000];    public static void main(String[] args) throws InterruptedException {        Map<String,Object> m =new HashMap<String,Object>();        int i =0;        int j=10000;        while(true){            for(;i<j;i++){                MemoryLeak memoryLeak = new MemoryLeak();                m.put(String.valueOf(i), memoryLeak);            }        }    }}

2、方法区内存溢出(outOfMemoryError:permgem space)

在jvm规范中,方法区主要存放的是类信息、常量、静态变量等。

所以如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出,一般该区发生内存溢出时的错误信息为:

outOfMemoryError:permgem space

代码举例:

  1. jvm参数:-XX:PermSize=2m -XX:MaxPermSize=2m

2. 将方法区的大小设置很低即可,在启动加载类库时就会出现内存不足的情况

3、线程栈溢出(java.lang.StackOverflowError)

线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。

一般线程栈溢出是由于递归太深或方法调用层级过多导致的。

发生栈溢出的错误信息为:

java.lang.StackOverflowError

代码举例:

 /** * 线程操作栈溢出 * * 参数:-Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m -Xss64k * */public class StackOverflowTest {    public static void main(String[] args) {        int i =0;        digui(i);    }    private static void digui(int i){        System.out.println(i++);        String[] s = new String[50];        digui(i);    }}

五、为了避免内存泄露,在编写代码的过程中可以参考下面的建议:

1、尽早释放无用对象的引用

2、使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域

3、尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收

4、避免在循环中创建对象

5、开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。

面试官:session和cookie

原作者:程序汪
原文链接:程序汪放水面试2年的Java女程序媛
原出处:公众号

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 程序汪放水面试2年的Java女程序媛