• Loading...
    2018-07-05
    今天阿里面试官问了我一个问题,我想了很久没想通,希望得到解答。为什么在标记垃圾的时候,需要stop the world

    作者回复: 对方问得有点含糊,不知道是否故意的,以cms为例,它有不同的mark: initial mark,conc mark, remark;conc时候不需要stw;其他需要短暂stw,这样引用关系才不变,另外效率也高

     3
     25
  • 铁拳阿牛
    2018-07-18
    -XX:NewRatio=value
    默认是2
    这里说是3面试官还说我记错了😣

    作者回复: 是我记错了,非常抱歉

    
     16
  • 小文同学
    2018-07-07
    班门弄斧,为老师补充一些关于Eden、两个Survivor的细节。
    1、大部分对象创建都是在Eden的,除了个别大对象外。
    2、Minor GC开始前,to-survivor是空的,from-survivor是由对象的。
    3、Minor GC后,Eden的存活对象都copy到to-survivor中,from-survivor的存活对象也复制to-survivor中。其中所有对象的年龄+1
    4、from-survivor清空,成为新的to-survivor,带有对象的to-survivor变成新的from-survivor。重复回到步骤2

    这是我看这边文章也有的疑问,通过查阅资料理解的,希望可以帮到其他同学
    展开

    作者回复: 非常感谢,下一章有配图详解,受制于一章的篇幅限制

     1
     14
  • Bruce
    2019-03-14
    回答一下留言的问题,为什么标记的时候要stop the world,是为了避免在标记的时候又有对象在堆内生成,如果这个对象对其他未标记对象有引用,而这个时候由于gc而清理掉了未标记的对象,会有问题
    
     10
  • 北溟鱼汤
    2018-07-05
    java.lang.Runtime类有freeMemory()、totalMemory()等方法可以获取到jvm内存情况,看了一下是本地方法。

    作者回复: 是的

    
     8
  • 野狼
    2018-07-24
    老师,请问如何判断是否有内存泄露

    作者回复: 泄露可以对比不同时间点内存分配,一般看用户类型的分配情况,什么在增加。具体,比如用jmap -histo:live 多次快照,然后对比差异,或者用jmc之类profiling工具,都可以进行,对比会更加流畅一些

    
     5
  • ethan
    2018-07-09
    jar包发生冲突,如何定位是哪些jar包发生问题

    作者回复: 出错信息应该包含具体类的名字等信息;mvn依赖树

    
     2
  • clz1341521
    2018-08-09
    java.lang.Runtime类有freeMemory()、totalMemory()等方法可以获取到jvm内存情况,看了一下是本地方法。
    另外看到有同学说jmc,jconsole在linux上用不了的问题,其实1可以远程连接,2可以使用xshell

    作者回复: 不错

    
     1
  • 小卡向前冲
    2018-07-11
    使用javaagent可以获得对象的大小,但是引入时有点麻烦,查到的资料都说需要将代码放到jar包中,然后在启动时加上 -javaagent:jar包名。
    放不知道这个算不算。
    
     1
  • L.B.Q.Y
    2018-07-05
    jmx可以做到通过代码而不是工具去监控,其实jdk安装包的工具也是对jmx的一个薄层的封装。

    作者回复: 是的

    
     1
  • Hidden
    2018-07-05
    新对象都会创建在eden 和from 区域,当发生minor gc时 把这两个区域的存活对象复制到 to区域,然后清理eden 和from 区域,是这样理解吧

    作者回复: 有点区别,新对象大多是在eden,from是minor gc活下来copy的

    
     1
  • 三木子
    2018-07-05
    除了工具就是命令方式了,用过命令有vmstat,这属于linux的,主要监控cpu和内存使用情况,这里是服务器总体内存,所以这个命令不是非常直观。

    作者回复: 也是个办法;JMX之类内建的方式更直观一些

    
     1
  • rike
    2020-01-31
    Compiler 部分,就是 JIT 的开销,显然关闭 TieredCompilation 会降低内存使用。
    按照上面讲的,加上参数-XX:-TieredCompilation后反而变大,jdk11,执行下面两个命令对比的结果
    java -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics HelloWorld
    Compiler (reserved=133KB, committed=133KB)
                                (malloc=2KB #42)
                                (arena=131KB #5)

    java -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics -XX:-TieredCompilation -XX:+UseParallelGC HelloWorld
    Compiler (reserved=2180KB, committed=2180KB)
                                (malloc=1KB #30)
                                (arena=2179KB #11)
    展开
    
    
  • rike
    2020-01-31
    在 JVM 内部,如果 Xms 小于 Xmx,堆的大小并不会直接扩展到其上限,也就是说保留的空间(reserved)大于实际能够使用的空间(committed)。当内存需求不断增长的时候,JVM 会逐渐扩展新生代等区域的大小,所以 Virtual 区域代表的就是暂时不可用(uncommitted)的空间。
    这里的Virtual 区域没看懂
    
    
  • rike
    2020-01-31
    Eden 和 Survivor 的大小是按照比例设置的,如果 SurvivorRatio 是 8,那么 Survivor 区域就是 Eden 的 1/8 大小,也就是新生代的 1/10,因为 YoungGen=Eden + 2*Survivor
    “Survivor 区域就是 Eden 的 1/8 大小”,这里的Survivor是指其中的s0或s1,还是两个加起来?
    
    
  • szh
    2019-07-31
    Direct Buffer 的直接内存可以用MXBean查看,相关接口是java.lang.management.BufferPoolMXBean。在JConsole中的MBean java.nio.BufferPool可以看到。
    
    
  • Liu Xian
    2019-05-22
    分析过一次Android上的堆外内存OOM,是通过/proc/pid/maps文件里找到的线索。在Linux和Android上堆外内存基本都是通过操作系统的mmap接口从内存映射区分配的,所以maps文件也可以提供一些分析线索。
    
    
  • Jeffrey
    2019-04-08
    -Xms和-Xmx为什么很多文章都建议设置成一样大?有的解释是增长过程中会引发Full Gc,请问老师是这样么?
    
    
  • 陈道恒
    2018-08-15
    当然,也有特殊情况,我们知道普通的对象会被分配在 TLAB 上;如果对象较大,JVM 会试图直接分配在 Eden 其他位置上;如果对象太大,完全无法在新生代找到足够长的连续空闲空间,JVM 就会直接分配到老年代。
            杨老师你好,大对象直接分配到老年代,这里是指多大?有没什么衡量标准?

    作者回复: 这个要看具体什么GC,如果cms是PretenureSizeThreshold,G1本身就有homongous object的概念,region大小的一半

    
    
  • 代码狂徒
    2018-07-22
    老师,麻烦咨询下,像jconsole和jmc这些图形化的工具不适用于linux 服务器环境下使用吧,我试了下貌似并没有反应,所以对服务器环境内存监控或者问题跟踪,有什么好的工具呢?
    
    
我们在线,来聊聊吧