首先面试官一上来就问:你知道菜鸟裹裹吗?答曰:听说过。不敢说不知道。
1、首先问你懂JVM吗?答曰:了解一点。然后就问(1)栈和堆的区别(PS:静态代码块和构造函数的运行顺序,以及父类构造函数和子类构造函数的运行顺序),(2)JVM运行机制,(3)一个HelloWorld.java运行出HelloWorld的流程:
(1)栈和堆的区别
java程序运行的关键是栈和堆。它们是把内存形象的分为栈内存和堆内存。
a.栈是运行时的单位,堆时存储单位。
b.栈内存中存储着句柄(对象的引用),堆内存中存储着new出来的对象实例。而且在实例化的时候建立句柄对内容的指向关系.
c.程序运行,首先访问句柄,然后调用具体内容。
d.软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰,分而治之的思想。
e. 栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。 Java 的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。 堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。
f.java中变量在内存中的分配
1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期--一直持续到整个"系统"关闭
2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置"。 实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存
3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放
附:java的内存机制
Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
2、Linux了解吗?答曰:了解一点。然后就是问题:你看过Linux内核吗?答曰:没有。看过Hadoop源码吗?答曰没有。我只是在上面用一些工具(yum,vim,tcpreplay,snort,Hadoop生态系统安装配置。Linux服务器系统安装)
3、机器学习算法HMM,马尔科夫链,SVM,Fpgrowth算法的优化,可以对其频繁模式挖掘过程中采用HMM模型一样训练出一个模型,然后在数据不断增长的情况下,怎么优化。讲讲马尔科夫链是什么,HMM模型的过程,用处(预测)。看过矩阵论吗?答曰:没有。那你知道协方差(对两个模型的选择,比较哪个模型更适合场景应用),特征向量,特征值。。。。。算法不需要代码实现,需要知道原理,怎么应用。
4、针对一年的日志数据,怎么找出其中排名前10的异常数据。
答曰:
(模板)6、海量数据分布在100台电脑中,想个办法高校统计出这批数据的TOP10。
方案1:
s 在每台电脑上求出TOP10,可以采用包含10个元素的堆完成(TOP10小,用最大堆,TOP10大,用最小堆)。比如求TOP10大,我们首先取前10个元素调整成最小堆,如果发现,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是TOP10大。
s 求出每台电脑上的TOP10后,然后把这100台电脑上的TOP10组合起来,共1000个数据,再利用上面类似的方法求出TOP10就可以了。
不知道这算不算是阿里的面试。。。要是的话 让我找块墙撞了吧。。。答得这么渣。