hi Xintong,你能够告诉我flink中申请managed memory相关代码是在哪个类中吗?我想看看flink中native memory是怎么申请的
------------------ 原始邮件 ------------------ 发件人: "Xintong Song"<[hidden email]>; 发送时间: 2020年4月30日(星期四) 下午4:04 收件人: "user-zh"<[hidden email]>; 主题: Re: flink 1.10内存设置 常见的方法包括: - JNI 调用 - 通过 ProcessBuilder 启动一个新进程 - 通过 java reflection 调用 java 私有方法,绕过 JVM direct memory 计数申请 direct / mapped buffer Thank you~ Xintong Song On Thu, Apr 30, 2020 at 3:15 PM 蒋佳成(Jiacheng Jiang) <[hidden email]> wrote: > hi Xintong。java是怎么操作native memory的?有相应的api吗? > > > > > ------------------&nbsp;原始邮件&nbsp;------------------ > 发件人: "Xintong Song"<[hidden email]&gt;; > 发送时间: 2020年4月28日(星期二) 中午11:15 > 收件人: "user-zh"<[hidden email]&gt;; > 主题: Re: flink 1.10内存设置 > > > > > Managed&nbsp;用的是&nbsp;native&nbsp;memory,是不受&nbsp;JVM&nbsp;管理的,因此不会体现在&nbsp;JVM > 的启动参数上。可以参考一下邮件列表里之前的讨论内容[1]。 > > Thank&nbsp;you~ > > Xintong&nbsp;Song > > > [1]&nbsp;http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html > <http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html#a1872&gt; > > > On&nbsp;Tue,&nbsp;Apr&nbsp;28,&nbsp;2020&nbsp;at&nbsp;9:32&nbsp;AM&nbsp;蒋佳成(Jiacheng&nbsp;Jiang)&nbsp;< > [hidden email]&gt; > wrote: > > &gt;&nbsp;hi&amp;nbsp;Xintong > &gt;&nbsp;&amp;nbsp;&nbsp;&amp;nbsp; > > &gt;&nbsp;我还有一个问题,flink1.10在启动的时候会设置-Xmx,-Xms,-XX:MaxDirectMomerySize,-XX:MaxMetaspaceSize,官网也给出了这些设置的计算公式,但是并没有看见managed > &gt;&nbsp;memory在哪里,managed&nbsp;memory似乎不属于jvm的堆,堆外和metaspace。那么managed > &gt;&nbsp;memory属于哪块内存呢?为什么没有设置相应的jvm参数呢? > &gt; > &gt; > &gt; > &gt; > &gt;&nbsp;------------------&amp;nbsp;原始邮件&amp;nbsp;------------------ > &gt;&nbsp;发件人:&nbsp;&quot;Xintong&nbsp;Song&quot;<[hidden email] > &amp;gt;; > &gt;&nbsp;发送时间:&nbsp;2020年4月27日(星期一)&nbsp;晚上6:56 > &gt;&nbsp;收件人:&nbsp;&quot;user-zh&quot;<[hidden email]&amp;gt;; > &gt;&nbsp;主题:&nbsp;Re:&nbsp;flink&nbsp;1.10内存设置 > &gt; > &gt; > &gt; > &gt; > > &gt;&nbsp;&amp;nbsp;Framework&amp;nbsp;Off-heap&amp;nbsp;和&amp;nbsp;Task&amp;nbsp;Off-Heap&amp;nbsp;之间是没有隔离的。Network > > &gt;&nbsp;可以认为和前面两者是有隔离的,会在初始化的时候申请一个固定大小的&amp;nbsp;buffer&amp;nbsp;pool,整个运行过程中的内存占用是一个常量。 > &gt; > &gt;&nbsp;Thank&amp;nbsp;you~ > &gt; > &gt;&nbsp;Xintong&amp;nbsp;Song > &gt; > &gt; > &gt; > &gt; > > &gt;&nbsp;On&amp;nbsp;Mon,&amp;nbsp;Apr&amp;nbsp;27,&amp;nbsp;2020&amp;nbsp;at&amp;nbsp;6:14&amp;nbsp;PM&amp;nbsp;蒋佳成(Jiacheng&amp;nbsp;Jiang)&amp;nbsp;< > &gt;&nbsp;[hidden email]&amp;gt; > &gt;&nbsp;wrote: > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;Thank&amp;amp;nbsp;you&amp;amp;nbsp;Xintong.我还有一个问题官网上: > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;-XX:MaxDirectMemorySizeFramework&amp;nbsp;+&amp;nbsp;Task&amp;nbsp;Off-Heap&amp;nbsp;+&amp;nbsp;Network&amp;nbsp;Memory > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;MaxDirectMemorySize=Framework&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;+&amp;nbsp;Task&amp;nbsp;Off-Heap&amp;nbsp;+&amp;nbsp;Network > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;Memory。假如MaxDirectMemorySize=10,那么10=1+1+8和10=1+8+1,这2种情况有什么不一样吗?我的意思是这3个堆外内存有隔离吗?我之前没有设置task > &gt;&nbsp;&amp;gt;&amp;nbsp;off-heap,但是还能启一个job,感觉没有隔离。 > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------ > > &gt;&nbsp;&amp;gt;&amp;nbsp;发件人:&amp;nbsp;&amp;quot;Xintong&amp;nbsp;Song&amp;quot;< > [hidden email] > &gt;&nbsp;&amp;amp;gt;; > &gt;&nbsp;&amp;gt;&amp;nbsp;发送时间:&amp;nbsp;2020年4月27日(星期一)&amp;nbsp;中午12:06 > &gt;&nbsp;&amp;gt;&amp;nbsp;收件人:&amp;nbsp;&amp;quot;user-zh&amp;quot;< > [hidden email]&amp;amp;gt;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;主题:&amp;nbsp;Re:&amp;nbsp;flink&amp;nbsp;1.10内存设置 > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;你好, > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;Flink&amp;amp;nbsp;1.10&amp;amp;nbsp;对不同的内存类型进行了更精细的控制,明确了总内存中每种类型、用途的内存的大小。举个例子,如果简单考虑&amp;amp;nbsp;TM&amp;amp;nbsp;中有&amp;amp;nbsp;heap, > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;direct,&amp;amp;nbsp;native&amp;amp;nbsp;三种内存类型,总内存大小是&amp;amp;nbsp;300mb。在之前的版本中,可能是&amp;amp;nbsp;heap&amp;amp;nbsp;固定占用100mb,剩下&amp;amp;nbsp;direct&amp;amp;nbsp;和 > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;native&amp;amp;nbsp;共用&amp;amp;nbsp;200mb。理论上,direct/native&amp;amp;nbsp;可以分别占用&amp;amp;nbsp;200/0,&amp;amp;nbsp;100/100,&amp;amp;nbsp;0/200,只要总大小不超过&amp;amp;nbsp;200 > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;即可。但是一旦出现超用,我们很难判断是&amp;amp;nbsp;direct&amp;amp;nbsp;还是&amp;amp;nbsp;native&amp;amp;nbsp;内存造成的。在&amp;amp;nbsp;Flink&amp;amp;nbsp;1.10&amp;amp;nbsp;里,对&amp;amp;nbsp;direct/native > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;分别用多少也做了明确的划分,这样一旦出现内存不足,就能够知道是哪部分造成的。上述描述是对内存模型做了简化,实际&amp;amp;nbsp;Flink > &gt;&nbsp;&amp;gt;&amp;nbsp;考虑的内存类型不只三种,具体可以参考相关文档[1]。 > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;针对你的问题,是&amp;amp;nbsp;direct&amp;amp;nbsp;内存不足造成的,在不改变总内存大小的情况下,可以调大 > > &gt;&nbsp;&amp;gt;&amp;nbsp;‘taskmanager.memory.task.off-heap.size’&amp;amp;nbsp;,详见[2]。 > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;关于隔离,Flink&amp;amp;nbsp;中一个&amp;amp;nbsp;TM&amp;amp;nbsp;上的多个&amp;amp;nbsp;slot&amp;amp;nbsp;是跑在同一个进程中的,由于&amp;amp;nbsp;JVM&amp;amp;nbsp;自身的特点,进程内不同线程的内存是没有隔离的。Flink > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;仅对托管内存(managed&amp;amp;nbsp;memory)[3]&amp;amp;nbsp;进行了隔离,这部分内存是由&amp;amp;nbsp;Flink&amp;amp;nbsp;负责管理申请、分配、释放的,不依赖于&amp;amp;nbsp;JVM > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;的垃圾回收机制。托管内存目前仅用于&amp;amp;nbsp;RocksDBStateBackend&amp;amp;nbsp;和部分&amp;amp;nbsp;Batch&amp;amp;nbsp;算子,与你现在遇到的&amp;amp;nbsp;direct&amp;amp;nbsp;oom&amp;amp;nbsp;的问题无关。 > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;Thank&amp;amp;nbsp;you~ > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;Xintong&amp;amp;nbsp;Song > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;[1] > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp; > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_detail.html > &gt;&nbsp;&amp;gt;&amp;nbsp;[2] > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp; > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory > &gt;&nbsp;&amp;gt;&amp;nbsp;[3] > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&gt;&nbsp;&amp;gt;&amp;nbsp;[3]> > &gt;&nbsp;< > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;gt;&amp;nbsp;[3]&gt > ; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp; > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98 > &gt;&nbsp;&amp;gt > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&gt;&nbsp;&amp;gt> > &gt;&nbsp;< > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;gt&gt > ; > &gt;&nbsp;; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;On&amp;amp;nbsp;Mon,&amp;amp;nbsp;Apr&amp;amp;nbsp;27,&amp;amp;nbsp;2020&amp;amp;nbsp;at&amp;amp;nbsp;10:31&amp;amp;nbsp;AM&amp;amp;nbsp;蒋佳成(Jiacheng&amp;amp;nbsp;Jiang)&amp;amp;nbsp;< > &gt;&nbsp;&amp;gt;&amp;nbsp;[hidden email]&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;wrote: > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;hi > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;amp;nbsp;我有个测试的单机的standalone > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;flink,平时跑几个测试job,tm内存设置了8g。最近升级了flink1.10,只设置了taskmanager.memory.flink.size为10g。但是启了一个数据量最大的job后,就无法再启动第二个job了,报内存不够:java.lang.OutOfMemoryError: > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Direct&amp;amp;nbsp;buffer&amp;amp;nbsp;memory。这是1个job就基本把所有的Direct > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Memory占完了吗?如果是这样的话,flink1.10还适合跑standalone&amp;amp;nbsp;cluster吗?slot没有隔离这个内存吗? > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;在官网讲解slot的地方有这么一句话:A&amp;amp;nbsp;TaskManager&amp;amp;nbsp;with&amp;amp;nbsp;three&amp;amp;nbsp;slots,&amp;amp;nbsp;for&amp;amp;nbsp;example,&amp;amp;nbsp;will > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;dedicate&amp;amp;nbsp;1/3&amp;amp;nbsp;of&amp;amp;nbsp;its&amp;amp;nbsp;managed&amp;amp;nbsp;memory&amp;amp;nbsp;to&amp;amp;nbsp;each&amp;amp;nbsp;slot.&amp;amp;amp;nbsp;这里的its&amp;amp;nbsp;managed > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;memory指的是taskmanager.memory.managed.size产生指定的内存吗? > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;best&amp;amp;amp;nbsp; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Jungle |
内存申请是在 MemoryUtils#allocateUnsafe 。这里面最重要的是要通过 Unsafe 的 private static
field 拿到 Unsafe 对象,这部分逻辑是在 MemoryUtils#getUnsafe 。 Thank you~ Xintong Song On Wed, May 6, 2020 at 5:41 PM 蒋佳成(Jiacheng Jiang) <[hidden email]> wrote: > hi Xintong,你能够告诉我flink中申请managed memory相关代码是在哪个类中吗?我想看看flink中native > memory是怎么申请的 > > > > > ------------------ 原始邮件 ------------------ > 发件人: "Xintong Song"<[hidden email]>; > 发送时间: 2020年4月30日(星期四) 下午4:04 > 收件人: "user-zh"<[hidden email]>; > 主题: Re: flink 1.10内存设置 > > > > 常见的方法包括: > - JNI 调用 > - 通过 ProcessBuilder 启动一个新进程 > > - 通过 java reflection 调用 java 私有方法,绕过 JVM direct memory 计数申请 direct / mapped > buffer > > Thank you~ > > Xintong Song > > > > > On Thu, Apr 30, 2020 at 3:15 PM 蒋佳成(Jiacheng Jiang) < > [hidden email]> > wrote: > > > hi Xintong。java是怎么操作native memory的?有相应的api吗? > > > > > > > > > > ------------------&nbsp;原始邮件&nbsp;------------------ > > 发件人: "Xintong Song"<[hidden email] > &gt;; > > 发送时间: 2020年4月28日(星期二) 中午11:15 > > 收件人: "user-zh"<[hidden email]&gt;; > > 主题: Re: flink 1.10内存设置 > > > > > > > > > > > Managed&nbsp;用的是&nbsp;native&nbsp;memory,是不受&nbsp;JVM&nbsp;管理的,因此不会体现在&nbsp;JVM > > 的启动参数上。可以参考一下邮件列表里之前的讨论内容[1]。 > > > > Thank&nbsp;you~ > > > > Xintong&nbsp;Song > > > > > > [1]&nbsp; > http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html > > < > http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html#a1872&gt; > > > > > > > On&nbsp;Tue,&nbsp;Apr&nbsp;28,&nbsp;2020&nbsp;at&nbsp;9:32&nbsp;AM&nbsp;蒋佳成(Jiacheng&nbsp;Jiang)&nbsp;< > > [hidden email]&gt; > > wrote: > > > > &gt;&nbsp;hi&amp;nbsp;Xintong > > &gt;&nbsp;&amp;nbsp;&nbsp;&amp;nbsp; > > > > > &gt;&nbsp;我还有一个问题,flink1.10在启动的时候会设置-Xmx,-Xms,-XX:MaxDirectMomerySize,-XX:MaxMetaspaceSize,官网也给出了这些设置的计算公式,但是并没有看见managed > > > &gt;&nbsp;memory在哪里,managed&nbsp;memory似乎不属于jvm的堆,堆外和metaspace。那么managed > > &gt;&nbsp;memory属于哪块内存呢?为什么没有设置相应的jvm参数呢? > > &gt; > > &gt; > > &gt; > > &gt; > > > &gt;&nbsp;------------------&amp;nbsp;原始邮件&amp;nbsp;------------------ > > > &gt;&nbsp;发件人:&nbsp;&quot;Xintong&nbsp;Song&quot;< > [hidden email] > > &amp;gt;; > > &gt;&nbsp;发送时间:&nbsp;2020年4月27日(星期一)&nbsp;晚上6:56 > > &gt;&nbsp;收件人:&nbsp;&quot;user-zh&quot;< > [hidden email]&amp;gt;; > > > &gt;&nbsp;主题:&nbsp;Re:&nbsp;flink&nbsp;1.10内存设置 > > &gt; > > &gt; > > &gt; > > &gt; > > > > > &gt;&nbsp;&amp;nbsp;Framework&amp;nbsp;Off-heap&amp;nbsp;和&amp;nbsp;Task&amp;nbsp;Off-Heap&amp;nbsp;之间是没有隔离的。Network > > > > > &gt;&nbsp;可以认为和前面两者是有隔离的,会在初始化的时候申请一个固定大小的&amp;nbsp;buffer&amp;nbsp;pool,整个运行过程中的内存占用是一个常量。 > > &gt; > > &gt;&nbsp;Thank&amp;nbsp;you~ > > &gt; > > &gt;&nbsp;Xintong&amp;nbsp;Song > > &gt; > > &gt; > > &gt; > > &gt; > > > > > &gt;&nbsp;On&amp;nbsp;Mon,&amp;nbsp;Apr&amp;nbsp;27,&amp;nbsp;2020&amp;nbsp;at&amp;nbsp;6:14&amp;nbsp;PM&amp;nbsp;蒋佳成(Jiacheng&amp;nbsp;Jiang)&amp;nbsp;< > > &gt;&nbsp;[hidden email]&amp;gt; > > &gt;&nbsp;wrote: > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Thank&amp;amp;nbsp;you&amp;amp;nbsp;Xintong.我还有一个问题官网上: > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;-XX:MaxDirectMemorySizeFramework&amp;nbsp;+&amp;nbsp;Task&amp;nbsp;Off-Heap&amp;nbsp;+&amp;nbsp;Network&amp;nbsp;Memory > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;MaxDirectMemorySize=Framework&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;+&amp;nbsp;Task&amp;nbsp;Off-Heap&amp;nbsp;+&amp;nbsp;Network > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Memory。假如MaxDirectMemorySize=10,那么10=1+1+8和10=1+8+1,这2种情况有什么不一样吗?我的意思是这3个堆外内存有隔离吗?我之前没有设置task > > > &gt;&nbsp;&amp;gt;&amp;nbsp;off-heap,但是还能启一个job,感觉没有隔离。 > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------ > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;发件人:&amp;nbsp;&amp;quot;Xintong&amp;nbsp;Song&amp;quot;< > > [hidden email] > > &gt;&nbsp;&amp;amp;gt;; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;发送时间:&amp;nbsp;2020年4月27日(星期一)&amp;nbsp;中午12:06 > > > &gt;&nbsp;&amp;gt;&amp;nbsp;收件人:&amp;nbsp;&amp;quot;user-zh&amp;quot;< > > [hidden email]&amp;amp;gt;; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;主题:&amp;nbsp;Re:&amp;nbsp;flink&amp;nbsp;1.10内存设置 > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;你好, > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Flink&amp;amp;nbsp;1.10&amp;amp;nbsp;对不同的内存类型进行了更精细的控制,明确了总内存中每种类型、用途的内存的大小。举个例子,如果简单考虑&amp;amp;nbsp;TM&amp;amp;nbsp;中有&amp;amp;nbsp;heap, > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;direct,&amp;amp;nbsp;native&amp;amp;nbsp;三种内存类型,总内存大小是&amp;amp;nbsp;300mb。在之前的版本中,可能是&amp;amp;nbsp;heap&amp;amp;nbsp;固定占用100mb,剩下&amp;amp;nbsp;direct&amp;amp;nbsp;和 > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;native&amp;amp;nbsp;共用&amp;amp;nbsp;200mb。理论上,direct/native&amp;amp;nbsp;可以分别占用&amp;amp;nbsp;200/0,&amp;amp;nbsp;100/100,&amp;amp;nbsp;0/200,只要总大小不超过&amp;amp;nbsp;200 > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;即可。但是一旦出现超用,我们很难判断是&amp;amp;nbsp;direct&amp;amp;nbsp;还是&amp;amp;nbsp;native&amp;amp;nbsp;内存造成的。在&amp;amp;nbsp;Flink&amp;amp;nbsp;1.10&amp;amp;nbsp;里,对&amp;amp;nbsp;direct/native > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;分别用多少也做了明确的划分,这样一旦出现内存不足,就能够知道是哪部分造成的。上述描述是对内存模型做了简化,实际&amp;amp;nbsp;Flink > > > &gt;&nbsp;&amp;gt;&amp;nbsp;考虑的内存类型不只三种,具体可以参考相关文档[1]。 > > &gt;&nbsp;&amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;针对你的问题,是&amp;amp;nbsp;direct&amp;amp;nbsp;内存不足造成的,在不改变总内存大小的情况下,可以调大 > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;‘taskmanager.memory.task.off-heap.size’&amp;amp;nbsp;,详见[2]。 > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;关于隔离,Flink&amp;amp;nbsp;中一个&amp;amp;nbsp;TM&amp;amp;nbsp;上的多个&amp;amp;nbsp;slot&amp;amp;nbsp;是跑在同一个进程中的,由于&amp;amp;nbsp;JVM&amp;amp;nbsp;自身的特点,进程内不同线程的内存是没有隔离的。Flink > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;仅对托管内存(managed&amp;amp;nbsp;memory)[3]&amp;amp;nbsp;进行了隔离,这部分内存是由&amp;amp;nbsp;Flink&amp;amp;nbsp;负责管理申请、分配、释放的,不依赖于&amp;amp;nbsp;JVM > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;的垃圾回收机制。托管内存目前仅用于&amp;amp;nbsp;RocksDBStateBackend&amp;amp;nbsp;和部分&amp;amp;nbsp;Batch&amp;amp;nbsp;算子,与你现在遇到的&amp;amp;nbsp;direct&amp;amp;nbsp;oom&amp;amp;nbsp;的问题无关。 > > &gt;&nbsp;&amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Thank&amp;amp;nbsp;you~ > > &gt;&nbsp;&amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Xintong&amp;amp;nbsp;Song > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;[1] > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp; > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_detail.html > > &gt;&nbsp;&amp;gt;&amp;nbsp;[2] > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp; > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory > > &gt;&nbsp;&amp;gt;&amp;nbsp;[3] > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory> &gt;&nbsp;&amp;gt;&amp;nbsp;[3]> > > < > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&gt;&nbsp;&amp;gt;&amp;nbsp;[3]> > ; > > &gt;&nbsp;< > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;gt;&amp;nbsp;[3]&gt > >  > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;gt;&amp;nbsp;[3]&gt> > > ;; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp; > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98 > > &gt;&nbsp;&amp;gt > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98> &gt;&nbsp;&amp;gt> > > < > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&gt;&nbsp;&amp;gt> > ; > > &gt;&nbsp;< > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;gt&gt > >  > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;gt&gt> > > ;; > > &gt;&nbsp;; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;On&amp;amp;nbsp;Mon,&amp;amp;nbsp;Apr&amp;amp;nbsp;27,&amp;amp;nbsp;2020&amp;amp;nbsp;at&amp;amp;nbsp;10:31&amp;amp;nbsp;AM&amp;amp;nbsp;蒋佳成(Jiacheng&amp;amp;nbsp;Jiang)&amp;amp;nbsp;< > > &gt;&nbsp;&amp;gt;&amp;nbsp;[hidden email] > &amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;wrote: > > &gt;&nbsp;&amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;hi > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;amp;nbsp;我有个测试的单机的standalone > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;flink,平时跑几个测试job,tm内存设置了8g。最近升级了flink1.10,只设置了taskmanager.memory.flink.size为10g。但是启了一个数据量最大的job后,就无法再启动第二个job了,报内存不够:java.lang.OutOfMemoryError: > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Direct&amp;amp;nbsp;buffer&amp;amp;nbsp;memory。这是1个job就基本把所有的Direct > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Memory占完了吗?如果是这样的话,flink1.10还适合跑standalone&amp;amp;nbsp;cluster吗?slot没有隔离这个内存吗? > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;在官网讲解slot的地方有这么一句话:A&amp;amp;nbsp;TaskManager&amp;amp;nbsp;with&amp;amp;nbsp;three&amp;amp;nbsp;slots,&amp;amp;nbsp;for&amp;amp;nbsp;example,&amp;amp;nbsp;will > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;dedicate&amp;amp;nbsp;1/3&amp;amp;nbsp;of&amp;amp;nbsp;its&amp;amp;nbsp;managed&amp;amp;nbsp;memory&amp;amp;nbsp;to&amp;amp;nbsp;each&amp;amp;nbsp;slot.&amp;amp;amp;nbsp;这里的its&amp;amp;nbsp;managed > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;memory指的是taskmanager.memory.managed.size产生指定的内存吗? > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;best&amp;amp;amp;nbsp; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Jungle |
我理解是direct和native内存两者其实都是用的unsafe.allocateMemory来分配内存的,本质上是一样的,只不过DirectByteBuffer在new的时候会检查direct内存是否超过MaxDirectMemorySize,其实jvm不会管这块内存的,但是DirectByteBuffer会利用虚引用来释放内存。
------------------ 原始邮件 ------------------ 发件人: "Xintong Song"<[hidden email]>; 发送时间: 2020年5月6日(星期三) 晚上6:05 收件人: "user-zh"<[hidden email]>; 主题: Re: flink 1.10内存设置 内存申请是在 MemoryUtils#allocateUnsafe 。这里面最重要的是要通过 Unsafe 的 private static field 拿到 Unsafe 对象,这部分逻辑是在 MemoryUtils#getUnsafe 。 Thank you~ Xintong Song On Wed, May 6, 2020 at 5:41 PM 蒋佳成(Jiacheng Jiang) <[hidden email]> wrote: > hi Xintong,你能够告诉我flink中申请managed memory相关代码是在哪个类中吗?我想看看flink中native > memory是怎么申请的 > > > > > ------------------&nbsp;原始邮件&nbsp;------------------ > 发件人: "Xintong Song"<[hidden email]&gt;; > 发送时间: 2020年4月30日(星期四) 下午4:04 > 收件人: "user-zh"<[hidden email]&gt;; > 主题: Re: flink 1.10内存设置 > > > > 常见的方法包括: > -&nbsp;JNI&nbsp;调用 > -&nbsp;通过&nbsp;ProcessBuilder&nbsp;启动一个新进程 > > -&nbsp;通过&nbsp;java&nbsp;reflection&nbsp;调用&nbsp;java&nbsp;私有方法,绕过&nbsp;JVM&nbsp;direct&nbsp;memory&nbsp;计数申请&nbsp;direct&nbsp;/&nbsp;mapped > buffer > > Thank&nbsp;you~ > > Xintong&nbsp;Song > > > > > On&nbsp;Thu,&nbsp;Apr&nbsp;30,&nbsp;2020&nbsp;at&nbsp;3:15&nbsp;PM&nbsp;蒋佳成(Jiacheng&nbsp;Jiang)&nbsp;< > [hidden email]&gt; > wrote: > > &gt;&nbsp;hi&nbsp;Xintong。java是怎么操作native&nbsp;memory的?有相应的api吗? > &gt; > &gt; > &gt; > &gt; > &gt;&nbsp;------------------&amp;nbsp;原始邮件&amp;nbsp;------------------ > &gt;&nbsp;发件人:&nbsp;&quot;Xintong&nbsp;Song&quot;<[hidden email] > &amp;gt;; > &gt;&nbsp;发送时间:&nbsp;2020年4月28日(星期二)&nbsp;中午11:15 > &gt;&nbsp;收件人:&nbsp;&quot;user-zh&quot;<[hidden email]&amp;gt;; > &gt;&nbsp;主题:&nbsp;Re:&nbsp;flink&nbsp;1.10内存设置 > &gt; > &gt; > &gt; > &gt; > > &gt;&nbsp;Managed&amp;nbsp;用的是&amp;nbsp;native&amp;nbsp;memory,是不受&amp;nbsp;JVM&amp;nbsp;管理的,因此不会体现在&amp;nbsp;JVM > &gt;&nbsp;的启动参数上。可以参考一下邮件列表里之前的讨论内容[1]。 > &gt; > &gt;&nbsp;Thank&amp;nbsp;you~ > &gt; > &gt;&nbsp;Xintong&amp;nbsp;Song > &gt; > &gt; > &gt;&nbsp;[1]&amp;nbsp; > http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html > &gt;&nbsp;< > http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html#a1872&amp;gt; > &gt; > &gt; > > &gt;&nbsp;On&amp;nbsp;Tue,&amp;nbsp;Apr&amp;nbsp;28,&amp;nbsp;2020&amp;nbsp;at&amp;nbsp;9:32&amp;nbsp;AM&amp;nbsp;蒋佳成(Jiacheng&amp;nbsp;Jiang)&amp;nbsp;< > &gt;&nbsp;[hidden email]&amp;gt; > &gt;&nbsp;wrote: > &gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;hi&amp;amp;nbsp;Xintong > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;nbsp;&amp;nbsp;&amp;amp;nbsp; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;我还有一个问题,flink1.10在启动的时候会设置-Xmx,-Xms,-XX:MaxDirectMomerySize,-XX:MaxMetaspaceSize,官网也给出了这些设置的计算公式,但是并没有看见managed > > &gt;&nbsp;&amp;gt;&amp;nbsp;memory在哪里,managed&amp;nbsp;memory似乎不属于jvm的堆,堆外和metaspace。那么managed > &gt;&nbsp;&amp;gt;&amp;nbsp;memory属于哪块内存呢?为什么没有设置相应的jvm参数呢? > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------ > > &gt;&nbsp;&amp;gt;&amp;nbsp;发件人:&amp;nbsp;&amp;quot;Xintong&amp;nbsp;Song&amp;quot;< > [hidden email] > &gt;&nbsp;&amp;amp;gt;; > &gt;&nbsp;&amp;gt;&amp;nbsp;发送时间:&amp;nbsp;2020年4月27日(星期一)&amp;nbsp;晚上6:56 > &gt;&nbsp;&amp;gt;&amp;nbsp;收件人:&amp;nbsp;&amp;quot;user-zh&amp;quot;< > [hidden email]&amp;amp;gt;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;主题:&amp;nbsp;Re:&amp;nbsp;flink&amp;nbsp;1.10内存设置 > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;nbsp;Framework&amp;amp;nbsp;Off-heap&amp;amp;nbsp;和&amp;amp;nbsp;Task&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;之间是没有隔离的。Network > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;可以认为和前面两者是有隔离的,会在初始化的时候申请一个固定大小的&amp;amp;nbsp;buffer&amp;amp;nbsp;pool,整个运行过程中的内存占用是一个常量。 > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;Thank&amp;amp;nbsp;you~ > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;Xintong&amp;amp;nbsp;Song > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;On&amp;amp;nbsp;Mon,&amp;amp;nbsp;Apr&amp;amp;nbsp;27,&amp;amp;nbsp;2020&amp;amp;nbsp;at&amp;amp;nbsp;6:14&amp;amp;nbsp;PM&amp;amp;nbsp;蒋佳成(Jiacheng&amp;amp;nbsp;Jiang)&amp;amp;nbsp;< > &gt;&nbsp;&amp;gt;&amp;nbsp;[hidden email]&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;wrote: > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Thank&amp;amp;amp;nbsp;you&amp;amp;amp;nbsp;Xintong.我还有一个问题官网上: > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;-XX:MaxDirectMemorySizeFramework&amp;amp;nbsp;+&amp;amp;nbsp;Task&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;+&amp;amp;nbsp;Network&amp;amp;nbsp;Memory > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;MaxDirectMemorySize=Framework&amp;amp;amp;nbsp;Off-Heap&amp;amp;amp;nbsp;+&amp;amp;nbsp;Task&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;+&amp;amp;nbsp;Network > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Memory。假如MaxDirectMemorySize=10,那么10=1+1+8和10=1+8+1,这2种情况有什么不一样吗?我的意思是这3个堆外内存有隔离吗?我之前没有设置task > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;off-heap,但是还能启一个job,感觉没有隔离。 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;------------------&amp;amp;amp;nbsp;原始邮件&amp;amp;amp;nbsp;------------------ > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;发件人:&amp;amp;nbsp;&amp;amp;quot;Xintong&amp;amp;nbsp;Song&amp;amp;quot;< > &gt;&nbsp;[hidden email] > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;amp;gt;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;发送时间:&amp;amp;nbsp;2020年4月27日(星期一)&amp;amp;nbsp;中午12:06 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;收件人:&amp;amp;nbsp;&amp;amp;quot;user-zh&amp;amp;quot;< > &gt;&nbsp;[hidden email]&amp;amp;amp;gt;; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;主题:&amp;amp;nbsp;Re:&amp;amp;nbsp;flink&amp;amp;nbsp;1.10内存设置 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;你好, > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Flink&amp;amp;amp;nbsp;1.10&amp;amp;amp;nbsp;对不同的内存类型进行了更精细的控制,明确了总内存中每种类型、用途的内存的大小。举个例子,如果简单考虑&amp;amp;amp;nbsp;TM&amp;amp;amp;nbsp;中有&amp;amp;amp;nbsp;heap, > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;direct,&amp;amp;amp;nbsp;native&amp;amp;amp;nbsp;三种内存类型,总内存大小是&amp;amp;amp;nbsp;300mb。在之前的版本中,可能是&amp;amp;amp;nbsp;heap&amp;amp;amp;nbsp;固定占用100mb,剩下&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;和 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;native&amp;amp;amp;nbsp;共用&amp;amp;amp;nbsp;200mb。理论上,direct/native&amp;amp;amp;nbsp;可以分别占用&amp;amp;amp;nbsp;200/0,&amp;amp;amp;nbsp;100/100,&amp;amp;amp;nbsp;0/200,只要总大小不超过&amp;amp;amp;nbsp;200 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;即可。但是一旦出现超用,我们很难判断是&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;还是&amp;amp;amp;nbsp;native&amp;amp;amp;nbsp;内存造成的。在&amp;amp;amp;nbsp;Flink&amp;amp;amp;nbsp;1.10&amp;amp;amp;nbsp;里,对&amp;amp;amp;nbsp;direct/native > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;分别用多少也做了明确的划分,这样一旦出现内存不足,就能够知道是哪部分造成的。上述描述是对内存模型做了简化,实际&amp;amp;amp;nbsp;Flink > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;考虑的内存类型不只三种,具体可以参考相关文档[1]。 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;针对你的问题,是&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;内存不足造成的,在不改变总内存大小的情况下,可以调大 > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;‘taskmanager.memory.task.off-heap.size’&amp;amp;amp;nbsp;,详见[2]。 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;关于隔离,Flink&amp;amp;amp;nbsp;中一个&amp;amp;amp;nbsp;TM&amp;amp;amp;nbsp;上的多个&amp;amp;amp;nbsp;slot&amp;amp;amp;nbsp;是跑在同一个进程中的,由于&amp;amp;amp;nbsp;JVM&amp;amp;amp;nbsp;自身的特点,进程内不同线程的内存是没有隔离的。Flink > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;仅对托管内存(managed&amp;amp;amp;nbsp;memory)[3]&amp;amp;amp;nbsp;进行了隔离,这部分内存是由&amp;amp;amp;nbsp;Flink&amp;amp;amp;nbsp;负责管理申请、分配、释放的,不依赖于&amp;amp;amp;nbsp;JVM > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;的垃圾回收机制。托管内存目前仅用于&amp;amp;amp;nbsp;RocksDBStateBackend&amp;amp;amp;nbsp;和部分&amp;amp;amp;nbsp;Batch&amp;amp;amp;nbsp;算子,与你现在遇到的&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;oom&amp;amp;amp;nbsp;的问题无关。 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Thank&amp;amp;amp;nbsp;you~ > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Xintong&amp;amp;amp;nbsp;Song > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[1] > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp; > &gt;&nbsp;&amp;gt;&amp;nbsp; > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_detail.html > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[2] > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp; > &gt;&nbsp;&amp;gt;&amp;nbsp; > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3] > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3]> > &gt;&nbsp;< > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3]&gt > ; > &gt;&nbsp;&amp;gt;&amp;nbsp;< > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;amp;gt;&amp;amp;nbsp;[3]&amp;gt > &gt;&nbsp > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;amp;gt;&amp;amp;nbsp;[3]&amp;gt&gt;&nbsp> > ;; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp; > &gt;&nbsp;&amp;gt;&amp;nbsp; > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98 > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt> > &gt;&nbsp;< > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;gt;&amp;nbsp;&amp;amp;gt&gt > ; > &gt;&nbsp;&amp;gt;&amp;nbsp;< > &gt;&nbsp; > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;amp;gt&amp;gt > &gt;&nbsp > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;amp;gt&amp;gt&gt;&nbsp> > ;; > &gt;&nbsp;&amp;gt;&amp;nbsp;; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;On&amp;amp;amp;nbsp;Mon,&amp;amp;amp;nbsp;Apr&amp;amp;amp;nbsp;27,&amp;amp;amp;nbsp;2020&amp;amp;amp;nbsp;at&amp;amp;amp;nbsp;10:31&amp;amp;amp;nbsp;AM&amp;amp;amp;nbsp;蒋佳成(Jiacheng&amp;amp;amp;nbsp;Jiang)&amp;amp;amp;nbsp;< > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[hidden email] > &amp;amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;wrote: > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;hi > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;我有个测试的单机的standalone > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;flink,平时跑几个测试job,tm内存设置了8g。最近升级了flink1.10,只设置了taskmanager.memory.flink.size为10g。但是启了一个数据量最大的job后,就无法再启动第二个job了,报内存不够:java.lang.OutOfMemoryError: > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;Direct&amp;amp;amp;nbsp;buffer&amp;amp;amp;nbsp;memory。这是1个job就基本把所有的Direct > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;Memory占完了吗?如果是这样的话,flink1.10还适合跑standalone&amp;amp;amp;nbsp;cluster吗?slot没有隔离这个内存吗? > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;在官网讲解slot的地方有这么一句话:A&amp;amp;amp;nbsp;TaskManager&amp;amp;amp;nbsp;with&amp;amp;amp;nbsp;three&amp;amp;amp;nbsp;slots,&amp;amp;amp;nbsp;for&amp;amp;amp;nbsp;example,&amp;amp;amp;nbsp;will > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;dedicate&amp;amp;amp;nbsp;1/3&amp;amp;amp;nbsp;of&amp;amp;amp;nbsp;its&amp;amp;amp;nbsp;managed&amp;amp;amp;nbsp;memory&amp;amp;amp;nbsp;to&amp;amp;amp;nbsp;each&amp;amp;amp;nbsp;slot.&amp;amp;amp;amp;nbsp;这里的its&amp;amp;amp;nbsp;managed > &gt;&nbsp;&amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;memory指的是taskmanager.memory.managed.size产生指定的内存吗? > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > &gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;best&amp;amp;amp;amp;nbsp; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;Jungle |
基本上是这样的,关于内存释放的部分稍微有点不准确。
Heap 空间可以认为是 JVM 向 OS 申请好的一段连续内存。Java 对象 new 的时候是从这段 JVM 已经申请的内存中划分出一部分,GC 时对象 finalize 也是将内存还给 JVM,并不会真的像 OS 去释放内存。 Direct/Native 内存则是直接向 OS 申请的内存。持有该内存的对象在 finalize 的时候必须向 OS 释放这段内存,否则 GC 是无法自动释放该内存的,就会造成泄漏。 Direct 内存相比 Native 内存的区别主要有两点,一是申请时 JVM 会检查 MaxDirectMemorySize,二是 JVM 会保证 DirectByteBuffer 被销毁的时候会向 OS 去释放这段内存。 Native 内存需要我们自己保证内存的释放,在 Flink 中由于申请到的 Native 内存也是封装在 DirectByteBuffer 里的,所以这部分内存的释放是通过给 DirectByteBuffer 设置 cleaner 实现的。详见 `MemorySegmentFactory#allocateOffHeapUnsafeMemory` Thank you~ Xintong Song On Fri, May 8, 2020 at 10:48 AM 蒋佳成(Jiacheng Jiang) <[hidden email]> wrote: > > 我理解是direct和native内存两者其实都是用的unsafe.allocateMemory来分配内存的,本质上是一样的,只不过DirectByteBuffer在new的时候会检查direct内存是否超过MaxDirectMemorySize,其实jvm不会管这块内存的,但是DirectByteBuffer会利用虚引用来释放内存。 > > > > > ------------------ 原始邮件 ------------------ > 发件人: "Xintong Song"<[hidden email]>; > 发送时间: 2020年5月6日(星期三) 晚上6:05 > 收件人: "user-zh"<[hidden email]>; > 主题: Re: flink 1.10内存设置 > > > > > 内存申请是在 MemoryUtils#allocateUnsafe 。这里面最重要的是要通过 Unsafe 的 private static > field 拿到 Unsafe 对象,这部分逻辑是在 MemoryUtils#getUnsafe 。 > > Thank you~ > > Xintong Song > > > > > On Wed, May 6, 2020 at 5:41 PM 蒋佳成(Jiacheng Jiang) < > [hidden email]> wrote: > > > > hi Xintong,你能够告诉我flink中申请managed memory相关代码是在哪个类中吗?我想看看flink中native > > memory是怎么申请的 > > > > > > > > > > ------------------&nbsp;原始邮件&nbsp;------------------ > > 发件人: "Xintong Song"<[hidden email] > &gt;; > > 发送时间: 2020年4月30日(星期四) 下午4:04 > > 收件人: "user-zh"<[hidden email]&gt;; > > 主题: Re: flink 1.10内存设置 > > > > > > > > 常见的方法包括: > > -&nbsp;JNI&nbsp;调用 > > -&nbsp;通过&nbsp;ProcessBuilder&nbsp;启动一个新进程 > > > > > -&nbsp;通过&nbsp;java&nbsp;reflection&nbsp;调用&nbsp;java&nbsp;私有方法,绕过&nbsp;JVM&nbsp;direct&nbsp;memory&nbsp;计数申请&nbsp;direct&nbsp;/&nbsp;mapped > > buffer > > > > Thank&nbsp;you~ > > > > Xintong&nbsp;Song > > > > > > > > > > > On&nbsp;Thu,&nbsp;Apr&nbsp;30,&nbsp;2020&nbsp;at&nbsp;3:15&nbsp;PM&nbsp;蒋佳成(Jiacheng&nbsp;Jiang)&nbsp;< > > [hidden email]&gt; > > wrote: > > > > > &gt;&nbsp;hi&nbsp;Xintong。java是怎么操作native&nbsp;memory的?有相应的api吗? > > &gt; > > &gt; > > &gt; > > &gt; > > > &gt;&nbsp;------------------&amp;nbsp;原始邮件&amp;nbsp;------------------ > > > &gt;&nbsp;发件人:&nbsp;&quot;Xintong&nbsp;Song&quot;< > [hidden email] > > &amp;gt;; > > &gt;&nbsp;发送时间:&nbsp;2020年4月28日(星期二)&nbsp;中午11:15 > > &gt;&nbsp;收件人:&nbsp;&quot;user-zh&quot;< > [hidden email]&amp;gt;; > > > &gt;&nbsp;主题:&nbsp;Re:&nbsp;flink&nbsp;1.10内存设置 > > &gt; > > &gt; > > &gt; > > &gt; > > > > > &gt;&nbsp;Managed&amp;nbsp;用的是&amp;nbsp;native&amp;nbsp;memory,是不受&amp;nbsp;JVM&amp;nbsp;管理的,因此不会体现在&amp;nbsp;JVM > > &gt;&nbsp;的启动参数上。可以参考一下邮件列表里之前的讨论内容[1]。 > > &gt; > > &gt;&nbsp;Thank&amp;nbsp;you~ > > &gt; > > &gt;&nbsp;Xintong&amp;nbsp;Song > > &gt; > > &gt; > > &gt;&nbsp;[1]&amp;nbsp; > > http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html > > &gt;&nbsp;< > > > http://apache-flink.147419.n8.nabble.com/Flink-tt1869.html#a1872&amp;gt > ; > > &gt; > > &gt; > > > > > &gt;&nbsp;On&amp;nbsp;Tue,&amp;nbsp;Apr&amp;nbsp;28,&amp;nbsp;2020&amp;nbsp;at&amp;nbsp;9:32&amp;nbsp;AM&amp;nbsp;蒋佳成(Jiacheng&amp;nbsp;Jiang)&amp;nbsp;< > > &gt;&nbsp;[hidden email]&amp;gt; > > &gt;&nbsp;wrote: > > &gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;hi&amp;amp;nbsp;Xintong > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;nbsp;&amp;nbsp;&amp;amp;nbsp; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;我还有一个问题,flink1.10在启动的时候会设置-Xmx,-Xms,-XX:MaxDirectMomerySize,-XX:MaxMetaspaceSize,官网也给出了这些设置的计算公式,但是并没有看见managed > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;memory在哪里,managed&amp;nbsp;memory似乎不属于jvm的堆,堆外和metaspace。那么managed > > > &gt;&nbsp;&amp;gt;&amp;nbsp;memory属于哪块内存呢?为什么没有设置相应的jvm参数呢? > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;------------------&amp;amp;nbsp;原始邮件&amp;amp;nbsp;------------------ > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;发件人:&amp;nbsp;&amp;quot;Xintong&amp;nbsp;Song&amp;quot;< > > [hidden email] > > &gt;&nbsp;&amp;amp;gt;; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;发送时间:&amp;nbsp;2020年4月27日(星期一)&amp;nbsp;晚上6:56 > > > &gt;&nbsp;&amp;gt;&amp;nbsp;收件人:&amp;nbsp;&amp;quot;user-zh&amp;quot;< > > [hidden email]&amp;amp;gt;; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;主题:&amp;nbsp;Re:&amp;nbsp;flink&amp;nbsp;1.10内存设置 > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;nbsp;Framework&amp;amp;nbsp;Off-heap&amp;amp;nbsp;和&amp;amp;nbsp;Task&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;之间是没有隔离的。Network > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;可以认为和前面两者是有隔离的,会在初始化的时候申请一个固定大小的&amp;amp;nbsp;buffer&amp;amp;nbsp;pool,整个运行过程中的内存占用是一个常量。 > > &gt;&nbsp;&amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Thank&amp;amp;nbsp;you~ > > &gt;&nbsp;&amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;Xintong&amp;amp;nbsp;Song > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;On&amp;amp;nbsp;Mon,&amp;amp;nbsp;Apr&amp;amp;nbsp;27,&amp;amp;nbsp;2020&amp;amp;nbsp;at&amp;amp;nbsp;6:14&amp;amp;nbsp;PM&amp;amp;nbsp;蒋佳成(Jiacheng&amp;amp;nbsp;Jiang)&amp;amp;nbsp;< > > &gt;&nbsp;&amp;gt;&amp;nbsp;[hidden email] > &amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;wrote: > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Thank&amp;amp;amp;nbsp;you&amp;amp;amp;nbsp;Xintong.我还有一个问题官网上: > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;-XX:MaxDirectMemorySizeFramework&amp;amp;nbsp;+&amp;amp;nbsp;Task&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;+&amp;amp;nbsp;Network&amp;amp;nbsp;Memory > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;MaxDirectMemorySize=Framework&amp;amp;amp;nbsp;Off-Heap&amp;amp;amp;nbsp;+&amp;amp;nbsp;Task&amp;amp;nbsp;Off-Heap&amp;amp;nbsp;+&amp;amp;nbsp;Network > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Memory。假如MaxDirectMemorySize=10,那么10=1+1+8和10=1+8+1,这2种情况有什么不一样吗?我的意思是这3个堆外内存有隔离吗?我之前没有设置task > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;off-heap,但是还能启一个job,感觉没有隔离。 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;------------------&amp;amp;amp;nbsp;原始邮件&amp;amp;amp;nbsp;------------------ > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;发件人:&amp;amp;nbsp;&amp;amp;quot;Xintong&amp;amp;nbsp;Song&amp;amp;quot;< > > &gt;&nbsp;[hidden email] > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;amp;gt;; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;发送时间:&amp;amp;nbsp;2020年4月27日(星期一)&amp;amp;nbsp;中午12:06 > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;收件人:&amp;amp;nbsp;&amp;amp;quot;user-zh&amp;amp;quot;< > > &gt;&nbsp;[hidden email]&amp;amp;amp;gt;; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;主题:&amp;amp;nbsp;Re:&amp;amp;nbsp;flink&amp;amp;nbsp;1.10内存设置 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;你好, > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Flink&amp;amp;amp;nbsp;1.10&amp;amp;amp;nbsp;对不同的内存类型进行了更精细的控制,明确了总内存中每种类型、用途的内存的大小。举个例子,如果简单考虑&amp;amp;amp;nbsp;TM&amp;amp;amp;nbsp;中有&amp;amp;amp;nbsp;heap, > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;direct,&amp;amp;amp;nbsp;native&amp;amp;amp;nbsp;三种内存类型,总内存大小是&amp;amp;amp;nbsp;300mb。在之前的版本中,可能是&amp;amp;amp;nbsp;heap&amp;amp;amp;nbsp;固定占用100mb,剩下&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;和 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;native&amp;amp;amp;nbsp;共用&amp;amp;amp;nbsp;200mb。理论上,direct/native&amp;amp;amp;nbsp;可以分别占用&amp;amp;amp;nbsp;200/0,&amp;amp;amp;nbsp;100/100,&amp;amp;amp;nbsp;0/200,只要总大小不超过&amp;amp;amp;nbsp;200 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;即可。但是一旦出现超用,我们很难判断是&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;还是&amp;amp;amp;nbsp;native&amp;amp;amp;nbsp;内存造成的。在&amp;amp;amp;nbsp;Flink&amp;amp;amp;nbsp;1.10&amp;amp;amp;nbsp;里,对&amp;amp;amp;nbsp;direct/native > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;分别用多少也做了明确的划分,这样一旦出现内存不足,就能够知道是哪部分造成的。上述描述是对内存模型做了简化,实际&amp;amp;amp;nbsp;Flink > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;考虑的内存类型不只三种,具体可以参考相关文档[1]。 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;针对你的问题,是&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;内存不足造成的,在不改变总内存大小的情况下,可以调大 > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;‘taskmanager.memory.task.off-heap.size’&amp;amp;amp;nbsp;,详见[2]。 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;关于隔离,Flink&amp;amp;amp;nbsp;中一个&amp;amp;amp;nbsp;TM&amp;amp;amp;nbsp;上的多个&amp;amp;amp;nbsp;slot&amp;amp;amp;nbsp;是跑在同一个进程中的,由于&amp;amp;amp;nbsp;JVM&amp;amp;amp;nbsp;自身的特点,进程内不同线程的内存是没有隔离的。Flink > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;仅对托管内存(managed&amp;amp;amp;nbsp;memory)[3]&amp;amp;amp;nbsp;进行了隔离,这部分内存是由&amp;amp;amp;nbsp;Flink&amp;amp;amp;nbsp;负责管理申请、分配、释放的,不依赖于&amp;amp;amp;nbsp;JVM > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;的垃圾回收机制。托管内存目前仅用于&amp;amp;amp;nbsp;RocksDBStateBackend&amp;amp;amp;nbsp;和部分&amp;amp;amp;nbsp;Batch&amp;amp;amp;nbsp;算子,与你现在遇到的&amp;amp;amp;nbsp;direct&amp;amp;amp;nbsp;oom&amp;amp;amp;nbsp;的问题无关。 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Thank&amp;amp;amp;nbsp;you~ > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;Xintong&amp;amp;amp;nbsp;Song > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[1] > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp; > > &gt;&nbsp;&amp;gt;&amp;nbsp; > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_detail.html > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[2] > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp; > > &gt;&nbsp;&amp;gt;&amp;nbsp; > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3] > >  > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory> &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3]> > > ;< > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3]> > ; > > &gt;&nbsp;< > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3]&gt > >  > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[3]&gt> > > ;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;< > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;amp;gt;&amp;amp;nbsp;[3]&amp;gt > > &gt;&nbsp > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;amp;gt;&amp;amp;nbsp;[3]&amp;gt> &gt;&nbsp> > > < > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_trouble.html#outofmemoryerror-direct-buffer-memory&amp;amp;gt;&amp;amp;nbsp;[3]&amp;gt&gt;&nbsp> > ; > > ;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp; > > &gt;&nbsp;&amp;gt;&amp;nbsp; > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98 > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt > >  > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98> &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt> > > ;< > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt> > ; > > &gt;&nbsp;< > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;gt;&amp;nbsp;&amp;amp;gt&gt > >  > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;gt;&amp;nbsp;&amp;amp;gt&gt> > > ;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;< > > &gt;&nbsp; > > > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;amp;gt&amp;gt > > &gt;&nbsp > <https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;amp;gt&amp;gt> &gt;&nbsp> > > < > https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/ops/memory/mem_setup.html#%E6%89%98%E7%AE%A1%E5%86%85%E5%AD%98&amp;amp;gt&amp;gt&gt;&nbsp> > ; > > ;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;; > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;On&amp;amp;amp;nbsp;Mon,&amp;amp;amp;nbsp;Apr&amp;amp;amp;nbsp;27,&amp;amp;amp;nbsp;2020&amp;amp;amp;nbsp;at&amp;amp;amp;nbsp;10:31&amp;amp;amp;nbsp;AM&amp;amp;amp;nbsp;蒋佳成(Jiacheng&amp;amp;amp;nbsp;Jiang)&amp;amp;amp;nbsp;< > & > gt; &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;[hidden email] > > &amp;amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;wrote: > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;hi > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;我有个测试的单机的standalone > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;flink,平时跑几个测试job,tm内存设置了8g。最近升级了flink1.10,只设置了taskmanager.memory.flink.size为10g。但是启了一个数据量最大的job后,就无法再启动第二个job了,报内存不够:java.lang.OutOfMemoryError: > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;Direct&amp;amp;amp;nbsp;buffer&amp;amp;amp;nbsp;memory。这是1个job就基本把所有的Direct > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;Memory占完了吗?如果是这样的话,flink1.10还适合跑standalone&amp;amp;amp;nbsp;cluster吗?slot没有隔离这个内存吗? > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;在官网讲解slot的地方有这么一句话:A&amp;amp;amp;nbsp;TaskManager&amp;amp;amp;nbsp;with&amp;amp;amp;nbsp;three&amp;amp;amp;nbsp;slots,&amp;amp;amp;nbsp;for&amp;amp;amp;nbsp;example,&amp;amp;amp;nbsp;will > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt; > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;dedicate&amp;amp;amp;nbsp;1/3&amp;amp;amp;nbsp;of&amp;amp;amp;nbsp;its&amp;amp;amp;nbsp;managed&amp;amp;amp;nbsp;memory&amp;amp;amp;nbsp;to&amp;amp;amp;nbsp;each&amp;amp;amp;nbsp;slot.&amp;amp;amp;amp;nbsp;这里的its&amp;amp;amp;nbsp;managed > > &gt;&nbsp;&amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;memory指的是taskmanager.memory.managed.size产生指定的内存吗? > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt; > > &gt; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;best&amp;amp;amp;amp;nbsp; > > > > > &gt;&nbsp;&amp;gt;&amp;nbsp;&amp;amp;gt;&amp;amp;nbsp;&amp;amp;amp;gt;&amp;amp;amp;nbsp;Jungle |
Free forum by Nabble | Edit this page |