项目构建CPU满载问题的根源的查找
问题、探究过程和解决方法:
在接手一个新的项目构建的过程中,遇到了构建项目过程中,项目一直处于parsing java的过程
打开构建日志的位置
日志位置:
查询构建日志(build-log)发现 项目触发了很多的低内存信号,然后可以猜测afterGc 是触发了回收机制。
解决方法:
1.修改idea64.exe.vmoptions 中的-Xms 和-Xmx 的值,但修改后还是出现同样的错误,无效
2.重装idea,无效
3.重新刷新缓存,方法File-> Invalidate Caches / Restart... ,清除缓存并且重启,重启后idea会重新给这个项目建立索引,无效
4.根据同事的帮助,修改File -> settings -> Build,Execution,Deployment->Compiler->Build process heap size ,改大一些后再次编译,成功
反思:
这里的配置选项说的很清楚了,是构建过程堆内存,那么一般来说 我们只知道(起码我是这样的),堆内存是运行时期用来存放对象的地方,具体的内存可以回忆一下:
那么编译时期,为什么要使用堆内存呢?
这个问题其实很明显,编译的过程会解析语法树、检查死锁、分析逃逸之类的一系列的工作,使用一部分内存是很明显需要的。
为什么设置的编译过程堆内存不自动扩展呢?
首先明确的是 内存的申请和释放都是操作系统的内核态系统调用,频繁的申请和释放会降低性能。
如果可以自动扩展,那么为了保护执行时期需要使用的大量内存,就必然会被释放,这就导致前面说的降低性能。
那么更好的方法是什么呢?
复用!这也是运行时期GC的目的,实际上我们也证明了构建过程会GC复用内存,从上面我们的构建日志中发现的GC过程可以知道。
总结:
我认为这里的堆内存会在编译期间使用,然后结束编译期,即转为class文件后,释放这些内存。从进程的角度看,编译时期,是一个javac程序来执行编译,而完成后由java程序来执行运行。
我们来实验一下。
实验开始前:
开始编译后:
这里JAVA程序,内存是慢慢增加上来的,一开始只有100m左右,CPU满载的原因找到了,javac的内存不够大,导致一直GC回收,猜测需要所有java文件都读到内存后才开始写入class文件。
编译结束后:
运行开始后:这个不演示图片了,这个必然不可能没有一个JAVA Platform SE 程序在跑,没有我直播倒立洗头,截图为证
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
待解决的问题:
那么为什么是堆内存呢?
这个我也不知道,衍生的问题还有 既然堆内存在编译时期就已经存在,那么会不会编译时期已经存在所有的运行时期内存分布呢?
运行时期内存分布相信大家都很熟悉了 ,如下图所示:
堆和方法区是所有线程共享的,而绿色的三个区域是线程私有的。
项目构建CPU满载问题的根源的查找相关推荐
- python 项目构建工具_GitHub - shjlone/emake: 你见过的最简单的 GCC/CLANG 项目构建工具(python3版本)...
python3实现版本 Preface GNU Make 太麻烦?Makefile 写起来太臃肿?头文件依赖生成搞不定?多核同时编译太麻烦?Emake 帮你解决这些问题: 使用简单:设定源文件,设定编 ...
- 用 Maven 做项目构建
简介 本文将介绍基于 Apache Maven 3 的项目构建的基本概念和方法.Maven 是一套标准的项目构建和管理工具,使用统一规范的脚本进行项目构建,简单易用,摒弃了 Ant 中繁琐的构建元素, ...
- 利用Yocto构建嵌入式Linux教程01--第一个Yocto项目构建
大家好,从今日开始,计划写一个利用Yocto构建嵌入式Linux的教程,算是对个人工作和学习的一个总结. 本教程选用的Yocto版本为3.0.4,我使用的Linux发行版为Ubuntu 18.04 ( ...
- Linux ECS CPU满载100% TOP进程无法查看解决记录
一.阿里一台ECS测试服务器提示检查到挖矿程序运行. 文件名为/usr/lib/libiacpkmn.so.3 影响:CUP进程100%持续满载 二.处理方法 1.通过阿里云盾杀掉及隔离进程文件 无效 ...
- Vue项目构建开发入门
Vue项目构建开发入门 开篇:Vue CLI 3 项目构建基础 大家好,当你点进这个标题,开始阅读本章的时候,说明你对 Vue.js 是充满好奇心和求知欲的.我之前写过一篇文章,这样评价 Vue.js ...
- Gradle 2.0 用户指南翻译——第五十六章. 多项目构建
本文禁止w3cschool转载! 翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc . 本文翻译所在分支:https://github.com/m ...
- Gradle 1.12用户指南翻译——第五十六章. 多项目构建
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 使用 happypack 提升 Webpack 项目构建速度
本文简单介绍了 Happypack 的简单使用,不了解的同学可以进来看一看.也许会有所帮助. Happypack 作用 在使用 Webpack 对项目进行构建时,会对大量文件进行解析和处理.当文件数量 ...
- 项目构建之maven篇:2.HelloWorld项目构建过程
文件结构说明: 项目构建生命周期: 清理 编译 測试 打包 执行 部署 清理与编译 hello\pom.xml POM:Project Object Model,项目对象模型 pom.xml与ant的 ...
最新文章
- python教程下载地址-最新python实战教程网盘下载地址
- Android Studio2.0 教程从入门到精通Windows版
- 计算机安全的最后一道防线,汪文勇:灾备,数据安全的最后一道防线
- 大厂JVM GC面试题
- java log4j 热部署_JAVA类加载器分析--热部署的缺陷(有代码示例,及分析)
- RDS SQL Server死锁(Deadlock)系列之四利用Service Broker事件通知捕获死锁
- ::-webkit-scrollbar 滚动条的设置
- Linux服务-rsync
- c语言链表课件,C语言链表详解ppt课件.ppt
- 《Option Volatility Pricing》阅读笔记之 Volatility(波动率)
- 边框盒子 box-sizing 的 content-box 和 border-box属性
- android 动态磁贴,善用动态磁贴和Xbox游戏
- vue+eleme upload 上传图片(含gif动图) canvas压缩,base64转blob对象
- java开源物联网_JetLinks开源物联网平台源码 v1.8.0
- 2019游戏 f1_F1 2019
- 教你如何关闭Win7视频预览节约资源
- Springboot整合Websocket(推送消息通知)
- 序数是什么意思_vlookup 列序数是什么意思
- Cortex-M3处理器系统框图
- 飞机游戏中子弹与飞机的移动与边界源码