深入理解java虚拟机---java内存区域与内存溢出异常---2堆栈溢出

本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片、视频等原文的内容)

若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cnblogs.com/wengshuhang/p/10073638.html

对象在内存中的布局分为三块:对象头、实例数据、对齐补充

  主要说下对象头,其他两个看字面意思就知道了:存储32bit或64bit(看系统),哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程id等。

测试堆内存溢出:

启动参数:-Xms 最小堆空间 -Xmx最大堆空间 +HeapDumpOnOutOfMemoryError 内存堆转储快照 HeapDumpPath : dump文件生成路径

  

代码

  

可以用jvisualvm来打开dump文件进行分析,

内存泄漏则查询GC root的引用链, 不存在则是空间过小(上诉代码以及启动配置)

  然后是栈内存:

      启动参数:

   -Xss128k   Xss线程栈的内存容量

      代码:

一个解决日常多线程的内存溢出的方法:减少最大堆跟栈容量来获取更多的线程数量(以单位空间更小获取更多的数量)

其他参数: -XX:PermSize -XX:MaxPermSize  限制方法区的大小,间接限制到常量池(String的驻留池也在这)

                -XX: MaxDirectMemorySize 本机直接内存大小指定(默认与堆的最大值一样)

原文地址:https://www.cnblogs.com/wengshuhang/p/10073638.html