1、序列化有什么用?为什么要用序列化?我回答是按照中国大多数BLOG上说的那样回答的,貌似他们不赞同。
2、new一个JAVA对象的时候,内存是怎么分配的?
3、容器是怎么管理session的?
4、Spring的AOP是用什么原理实现的?我回答动态代理,他说还有一个,不知道是什么?
5、JVM的工作原理?注意不是工作流程,这谁都知道

解决方案 »

  1.   

    日哦?没一个人能回答吗?我还有更劲爆的传说中的关于JAVA底层的面试题哦~~~大家想知道不~~~哈哈~~~
      

  2.   

    1.序列化可以参考下这个帖子http://topic.csdn.net/u/20081024/16/0e27e271-5773-40fe-aa92-dd3af50dff78.html?269291275
    2.new一个JAVA对象的时候,在栈中分配一块内存存储变量即引用,这个变量指向堆内存中得值,大概就是这么个意思,表述的不是很清楚
    3.session参考下这篇文章,http://blog.csdn.net/iloveqing/archive/2007/03/29/1544958.aspx
    4.还一个是反射机制
    5.这个还真不知道。http://wuchangshengp27.blog.163.com/blog/static/60543761200811313826993/
      

  3.   

    第二个问题
    new 一个java对象在内存中分配出2快区域,一块存储要创建的对象,一块存储当前对象的引用
    不知道回到的对不对,等高手
      

  4.   

    spring的AOP还有一个应该是通过cglib修改字节码的吧,我没用过spring,纯属猜测
      

  5.   

     
      java 语言要比框架那些重要的多 
       
       可以不学框架  语言一定要学好  还有数据库  
      

  6.   

    1、java中new 一个对象放在堆中,栈中放的是对象引用
    2、序列化是为了解决在对对象流进行读写操作时所引发的问题。 
    3、当Session数量超过默认缓存大小,应用服务器6.0会将内存中的Session持久化到存储介质中,并根据Session的活跃性对存储中的Session和缓存中的Session进行交换。
    管理员可配置Session缓存池的大小。应用服务器6.0支持的Session持久化包括文件系统、RDBMS、BerkerlyDB,管理员可通过管理工具切换Session的存储方式。
    如果Session中的数据非常重要,即使服务器失效,这些数据也不能丢失,那么建议采用数据库来持久化Session。
    4、.aop的实现原理
    1>.其核心为自动生成代理对象(动态代理).
    动态代理在spring中有两种实现手段:jdk动态代理(Proxy+InvocationHandler),cglib动态代理.前者要求目标必须实现接口,而后者无此要求.2>代理对象由增强和目标两部分构成.3>代理对象与目标对象肯定是同一种类型.
    5、JVM不清楚,,不玩过
      

  7.   

    1、java中new 一个对象放在堆中,栈中放的是对象引用
    2、序列化是为了解决在对对象流进行读写操作时所引发的问题。  
    3、当Session数量超过默认缓存大小,应用服务器6.0会将内存中的Session持久化到存储介质中,并根据Session的活跃性对存储中的Session和缓存中的Session进行交换。
    管理员可配置Session缓存池的大小。应用服务器6.0支持的Session持久化包括文件系统、RDBMS、BerkerlyDB,管理员可通过管理工具切换Session的存储方式。
    如果Session中的数据非常重要,即使服务器失效,这些数据也不能丢失,那么建议采用数据库来持久化Session。
    4、.aop的实现原理
    1>.其核心为自动生成代理对象(动态代理).
    动态代理在spring中有两种实现手段:jdk动态代理(Proxy+InvocationHandler),cglib动态代理.前者要求目标必须实现接口,而后者无此要求.2>代理对象由增强和目标两部分构成.3>代理对象与目标对象肯定是同一种类型.
    5、JVM classload类加载
      

  8.   

    java一定要语言强悍,像框架啥的都是项目经理搭好了之后才让你干项目的某些模块
      

  9.   

    才疏学浅,我只知道
    1. 序列化 是为了保存对象用的,可以理解为复制一个按钮。 只有实现了这个接口才可以使用对象流来实现读写。2.  Object o = new Object() , 堆上创建object对象, 栈里保存引用 o 。
      

  10.   

    惭愧的表示,我实在不懂,幸好当时我面试的不是JAVA
      

  11.   

    面试后工作后..java基础的面试题忘光啦..学习
      

  12.   

    同求传说中的JAVA底层题,我4年了经验了,一道都不会,太 被悲催了
      

  13.   

    1、序列化有什么用?为什么要用序列化?我回答是按照中国大多数BLOG上说的那样回答的,貌似他们不赞同。
    好像序列化 是用来 网络传输对象的,把对象搞成2进制后 在网络上传送  然后 在序列化成对象2、new一个JAVA对象的时候,内存是怎么分配的?
    new 对象的时候 在内存中 建立一个 内存区域 就是堆内存 用来存放对象的属性, 当new完对象把对象的地址赋给对象的引用变量 这个时候 又在内存中建立一个区域 叫栈内存 用来存储 引用变量 引用变量存储对象的地址, 当对象没有被任何引用变量 引用的时候 就变成了 垃圾会被java的垃圾清除机制清除掉
    别的不知道了
      

  14.   

    jvm 不就是个脚本解释器么。跟php,python不都差不多么
      

  15.   

    高深呀   我也是学JAVA的  对着些概念性东西比较模糊,不过看了高手评论,表示略懂。
      

  16.   

    1:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容流化,流化后的对象进行读写操作,也可以将流化后的对象在网络间传输。序列化实现:将需要序列化的对象实现java.io.Serialiable接口,该接口没有需要实现的方法,只是为了标注该对象是可被序列化的。2:在内存的栈中分配一块空间存储引用,堆中存储变量,并指向栈。3:session是服务器为了分辩不同的用户而采取的一种保存方式,它会服务器中开辟一个区域,用于保存用户的信息,不同的用户信息是不同的,它们之间不能相互访问。session是由服务器去维护它,而不用程序员去操心,但是程序员可以修改、删除它,session它其实保存在一个Map中,每个session都会有一个sessionId,那么sessionId就是key,当创建之后,客户端的浏览器会自动记住这个sessionId,以后的每次请求都会带上这个sessionId给服务器,以区别不同的用户。这样服务器就会知道你是谁了!4:动态代理和反射(个人是这么理解的)5:JVM中的类是由classLoader和它的子类来实现的,Java ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件的类。(这个是JVM加载class文件的原理机制,你说的那个JVM工作原理还是google吧,google上很多的)
      

  17.   

    Spring 中会自动判断使用 JDK 1.3 中开始有的动态代理,还是使用 Cglib 中的动态代理。实际上 Cglib 的动态代理是靠 ASM 工具来修改字节码的。实际上 JDK 中的动态代理是在内存中产生代理类的字节码,原理跟 Cglib 的一样。个人认为 AOP 中最优秀的框架是 AspectJ
      

  18.   

    AOP 增强的织入,也就是 AOP 主要功能的实现有三种实现方式,性能由高到低依次为:编译期织入、类加载期织入和动态代理织入。依次对应着 Java 应用的生命周期的前半段:编译、类加载、运行。编译期织入需要有特殊的编译的,直接产生 JVM 兼容的字节码。这种类型主要的框架有 AspectJ
    类加载期织入需要有特殊的类加载器。这种类型主要的框架有 AspectJ 等
    运行期(动态代理)织入,依赖于 JDK 或者其他框架的动态代理功能实现。这种类型典型的是 Spring AOPAspectJ 有两种类型的织入,因此可以说是最棒的。像 Spring AOP 中有个切点表达式,那语法就是 AspectJ 切点表达式中的一部分。
      

  19.   

    关于 Session 的管理,我只能跟你说一下 tomcat 中的方式(下面这些是原来研究后在 CSDN 上的回复):Tomcat 中的 Session 是放在 org.apache.catalina.session.ManagerBase 类中,以 HashMap 格式存放,key 为 sessionId, value 为 org.apache.catalina.Session 接口,这个接口由 org.apache.catalina.session.StandardSession 类实现,这个类同时实现了 HttpSession 接口。实际上 Tomcat 中所使用的 HttpSession 实现并不把 StandardSession 拿来直接使用的,而是为这个类做了个 org.apache.catalina.session.StandardSessionFacade 的门面,这个门面什么事情都没做过,只是委托其内部属性的 StandardSession 去做。另外,StandardSession,也就是 HttpSession 在 Tomcat 中实现的根源,其中的数据,也就是我们采用 session.setAttribute(key, value); 设置进去的值是采用一个 Hashtable 来存放的。
      

  20.   

    new 一个类产生对象,具体的内存分配跟 JVM 的实现厂商相关,实现厂商想咋分配就咋分配。我不知道是不是想了解关于 JVM 堆中新生代、旧生代、持久代、年老代等相关堆内存的情况?这块就很复杂了,而且有很的 JVM 参数可以进行调整,是 JVM 性能调优中东西了。
      

  21.   

    堆内存用来存放由 new 创建的对象和数组. 在堆中分配的内存,由 Java 虚拟机的自动 垃圾回收器来管理. 在 堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的 取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象 的引用变 量. 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引 用变量来访问堆中的数组或对象.引用变量就相当于是为 数组或者对象起的一个名称.引 用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放. 而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在 的代码块之外, 数组和对象本身占据的内存不会被释放, 数组和对象在没有引用变量指向它 的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的 时间被垃圾回收器收走(释放掉).这也是 Java 比较占内存的原因
      

  22.   

    spring 的AOP除了动态代理,还有就是CGLIB实现!
      

  23.   

    JVM的工作原理不就是Java的跨平台、可移植性吗?虚拟机顾名思义是一台在主机上模拟出来的另一个处理器,有自己的一套处理系统如:处理器,堆栈、寄存器等,它的一大特色就是实现Java的“平台无关性”,它可以装在任何支持他的机器上,然后就可以处理Java程序针对他而生成的字节码文件,然后在通过它把字节码解释成开发机所能够理解的语言,从而完成开发工作。大概就是这样把。
      

  24.   

    当你想去做一个JVM出来的时候自然会知道的当你只想学JVM,用JVM的时候,你需要一辈子来学,值得么,明天出个JVN呢?
      

  25.   

    Spring的AOP是用什么原理实现的?我回答动态代理,他说还有一个,不知道是什么当spring发现类没有实现接口时候,会使用cglib来生成代理类前面的几个 ,也不难吧
      

  26.   


    实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。例如:
    User{
      String name;
      String icon;
      String message;
    }
    当我想把这个User信息从一个客户端发到另一个的时候:   我可能会这个写(不用序列化实现):
          String msg=user.getName()+"_"+user.getIcon()+"_"user.getMessage();
      把这个msg发到另一端,
          然后另一端解析这个字符串
      String[] msgs=msg.split("_");
      User user=new User();
      user.setName(msgs[0]);
      user.setIcon(msgs[1]);
      user.setMessage(msgs[2]);
    这样我们就完成了信息的传送,但是这样还是很麻烦的,如果字段多的话,而且你的分隔符'_'是不能在name,icon,message中出现,要不然另一端解析就会出错。
       
    如果用序列化实现,直接把user的字节码发过去,再另一端还原就OK了。
      

  27.   

    spring中动态代理和cglib都用过,JVM的工作原理,以前面试时,好像也被问到过。但不知道,这样的问题,要怎么回答到点子上,总不能说一大推吧,等牛人来回答一下。或者,面试的公司来解答一下么
      

  28.   


    楼主的这些问题 我面试官不是靠你的理论基础,而是始终应用举例。我会这么回答。
    1 序列化,我以前写过一个游戏,里面有很多对象,当我想保存有劲进度的时候 就用到了序列化,直接把游戏里面的对象全部保存到硬盘上, 下次打开游戏的时候我直接加载这些对象就ok。
    2. new一个对象会把对象放在堆栈里,堆栈的具体大小和实际内存条有关, 二不new的话是放在栈里 栈的空间很小1m~2m,而且栈还有队列顺序 虽然栈里的变量或者对象读写速度很快但是都是要保持对流原则很浪费性能,放在堆里,是很好的选择。
    3.session 每一个浏览器访问 在服务器都会产生一个session,sessionid是有浏览器决定,服务区通过sessionid来区别不同浏览器的访问,同一个浏览器不会再创建session,session有空闲时间设置,一般是30分钟超过就会失效,session占用的事服务器的资源,一般的话还是谨慎使用。
    4.spring 的实现 是ioc和aop思想,我感觉面试官靠这个题目如果你能打上来算80分 如果你还能联想到ioc在说一下 甚至再说一下springsecurity 你会得100分 甚至120分。 aop就是动态代理,动态代理的实现有很多,比如struts2的拦截器,(servlet的过滤器的思想也很像实现有点区别),他们的原理都差不多就是应用在不同的地方而已,spring 的反射机制没研究,感觉是在解析xml之后条用相应的属性赋值的时候用到了。5. 这个问题我也不清楚  jvm内部有一个大的适配器 为了跨平台,而为了代码能在适配器上运行,sun又想出来了一个class文件,jvm会根据不同的os(操作系统)来分别解析class,最后在编译成能在该os上运行的程序。当运行虚拟机的时候jvm类加载器classloader会找到main作为入口函数,进而把操作权交给main所在的类。另外在jre的lib下面还有策略文件来管理java的安全机制。
    我感觉面试 遇见自己不会的很正常,但是你别一看见不会就什么都不说了,要把自己会的说出来就ok了 面试也是两面性,你选他 他也要选择你
      

  29.   

    我来尝试一下回到最后一个问题JVM是一个虚拟机,它模拟一台电脑.这台电脑的cpu有一套特殊指令集.在程序执行过程中,jvm把class文件的bytecode翻译成真实的cpu(物理机器的cpu)指令来执行. 一般的指令翻译效率很差(如js),sun使用JIT(Just in Time)技术来解决这个问题.ps: 这个问题很大,你只要随便说点你了解的,且说对了,基本上就通过. 如果要把这个问题描述完备,够写几本书了,面试者不是要绝对正确的答案,而是要看你的表达能力,随即应变能力等
      

  30.   


    顶一下是用HashMap不是用WeakHashMap么
      

  31.   

    这类面试题,似乎很简单很简单啊,都是原理阐述,做java方面还是很在乎底层,否则后劲不足。