深入理解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/