V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
silianbo
V2EX  ›  程序员

面试题: java 程序运行过程中如何进行内存分配的或者介绍下内存分配的过程

  •  
  •   silianbo · 2015-07-20 17:36:18 +08:00 · 2489 次点击
    这是一个创建于 3413 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在面试过程中如何回答java程序运行过程中如何进行内存分配的或者介绍下内存分配的过程,这样类似于堆栈相关的问题,这样看似简单的问题,好多面试的过程中都会被问到,而我都只是一两句话结合new 说说堆栈,感觉面试官不是很满意,到底怎么样的答案才能让面试官点赞!
    结合segmentfault 社区http://segmentfault.com/a/1190000002931555说说怎么样!
    欢迎提供。
    5 条回复    2015-07-21 02:32:27 +08:00
    SoloCompany
        1
    SoloCompany  
       2015-07-20 19:53:53 +08:00 via iPad
    你确定new会使用堆栈?这也难怪面试官会不太满意啊
    silianbo
        2
    silianbo  
    OP
       2015-07-20 20:08:12 +08:00
    @SoloCompany
    我说的我是通过一个对象创建的例子来说明问题的
    Java 不应该new来分配内存的么,在堆中产生吗!这样的说法有错吗!望指导
    SoloCompany
        3
    SoloCompany  
       2015-07-20 20:13:21 +08:00   ❤️ 1
    @silianbo 我想,面试官大概希望你能说出堆栈,堆,permgen(虽然已经取消了)的区别和用途,或许还希望你顺便可以提提 -mx -ms 这些参数的作用,如果你能谈到younggen和oldgen的话,还有加分(我只是脑补而已
    但如果堆和堆栈分不清的话,的确是不太应该
    icecoffee
        4
    icecoffee  
       2015-07-20 20:38:18 +08:00
    Yong Gen, Thread Local Allocation Buffer, bump-the-pointer.
    Cloudee
        5
    Cloudee  
       2015-07-21 02:32:27 +08:00 via iPhone
    分配对象的基本过程的是
    1. 通过allocate分配空间并压栈,(一般来说是挪eden区的指针。挪完后同时旧指针压栈,或者存到一个地方然后把表示那个地方的句柄压栈,看实现)
    2. dup复制栈里的指针/句柄,跟后面用
    3. 压构造函数需要的参数
    4. 通过invokespecial调用构造函数(会吃掉3里面压进去的参数和2里dup出来的指针/句柄作为this)
    到此new完成,栈顶是构造好的对象。HotSpot会进行各种优化,比如根据逃逸分析分析出来分配的对象不会离开方法的范围,可能就会直接把对象分配到栈上等等

    分配数组比较简单直接allocatearray分派好就完了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2805 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:55 · PVG 19:55 · LAX 03:55 · JFK 06:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.