JVM(和Spark)性能优化:使用Java Mission Control (5)
3.2.2 内存分配压力
分配选项卡包含有关线程本地分配缓冲区 (TLAB) 内外的已分配对象的数据。按类新 TLAB 中的分配/ TLAB 外部的分配->分配和按线程分配子选项卡包含有关按类或按线程列出的 TLAB 分配压力和堆栈跟踪的信息。
例如下图中,解析模块数据转换比较耗费内存,压力很大,可以深入分析代码:

请注意,“对象统计信息”选项卡默认是没有数据,提示说此记录中未启用事件类型'Object Count'。堆内容面板中包括哪些类有多少实例,占用了多少空间和比率。增长最快的对象面板中包括类名,堆中类实例数和大小的增长的数量,对于分析内存压力很有帮助。
启用事件类型'Object Count',可以在JMC的窗口->飞行记录模版管理器,导入文件C:\Program Files\Java\jre7\lib\jfr下的profile,再点编辑->高级,在UI中的筛选器中输入count,把Object Count(和Object Count after GC,可选)启用,

然后保存导出为profile_heap.jfr到C:\Program Files\Java\jre7\lib\jfr目录下(注意,是jre的目录)。并且修改集群配置:
1、 把集群中每个jre7/lib/jfr目录(可能在/opt/huawei/Bigdata/jdk1.7.0_72/jre/lib/jfr)下添加profile_heap.jfr文件,并且修改其权限与default、profile文件一样
2、 把每个spark-env.sh (可能在/opt/tsp/server/hadoopclient/Spark/spark/conf/ )的【命令选项5】中,settings=profile_heap
再运行应用程序后,“对象统计信息”选项卡中就有数据了。例如:

读者也可以观察到,在大数据处理中byte[]和char[](String对象内部就有它)常常是分配压力极大的对象,而数组一般需要连续的内存地址来存放。
- 点赞
- 收藏
- 关注作者
评论(0)