V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
esolve
V2EX  ›  问与答

Java : 一个代码块结束后,代码块内部引用的内存会被回收吗?

  •  
  •   esolve · 2017-09-27 20:53:19 +08:00 · 2274 次点击
    这是一个创建于 2600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    譬如

    if(flag=true){
        Student stu = new Student();
        ...
        ...
    }
    

    上面 if 代码块结束后,整个函数结束前

    gc 扫描的时候

    这里 stu 指向的对象会被回收吗?

    10 条回复    2017-09-28 20:51:55 +08:00
    doing
        1
    doing  
       2017-09-27 21:49:20 +08:00
    不会。
    yorTX9t
        2
    yorTX9t  
       2017-09-27 22:21:52 +08:00
    C++ 可以,Java 不行

    {
    Student stu{};
    //...
    }
    esolve
        3
    esolve  
    OP
       2017-09-27 22:35:36 +08:00 via iPhone
    @doing 是因为 stu 还在函数栈吗?那函数结束的时候就可以被回收了吧
    arrow2015
        4
    arrow2015  
       2017-09-27 22:41:58 +08:00 via Android
    关键是怎么做验证 (我不会 🤔)
    verrickt
        5
    verrickt  
       2017-09-27 23:22:28 +08:00 via Android
    @esolve 这个跟 Gc 的具体实现有关。你可以去知乎查下 R 大。R 大有篇回答讲的很详细
    rosu
        6
    rosu  
       2017-09-27 23:30:37 +08:00 via Android   ❤️ 1
    歪个楼,确定不是 == 吗?
    x7395759
        7
    x7395759  
       2017-09-28 00:03:56 +08:00
    推荐书籍,深入理解 jvm 虚拟机
    honeycomb
        8
    honeycomb  
       2017-09-28 01:53:39 +08:00 via Android
    @esolve system.gc() + 断点?
    虽然前者并不保证一定会跑一次 gc
    而且可能还要像楼上说的那样把几种不同的 gc 都试一下
    mifly
        9
    mifly  
       2017-09-28 10:08:53 +08:00 via iPhone
    @esolve 如果那么希望自己管理内存,不应该用 Java,而是用 c,c++等更底层的

    目前 Java 是不提供直接操作内存的 API 给你用的,不是你想释放内存就能释放内存,这个是由 GC 来做的,你不用管,当然也是要注意代码的写法,避免内存不足的问题。你是从其他语言过来的吧,建议先看下 Java 的设计思想,解决的问题
    lslqtz
        10
    lslqtz  
       2017-09-28 20:51:55 +08:00
    c#好像会
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2636 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:25 · PVG 11:25 · LAX 19:25 · JFK 22:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.