作为 Java 程序员而言,先不考虑自己系统外部依赖的缓存、消息队列、数据库等等东西挂掉,就我们自己系统本身而言,最常见的挂掉的原因是什么?

其实就是系统OOM,也就是所谓的内存溢出!

什么是内存溢出?在哪些区域会发生内存溢出?

运行一个 Java 系统就是运行一个JVM进程

首先的话呢,大家得先搞明白一个事情,就是我们平时说启动一个Java系统,其实本质就是启动一个JVM进程。

咱们就用最最基本的情况来给大家演示一下好了,比如说下面的一段代码,是每个Java初学者都会写的一段代码:

那么大家知道,当你在Eclipse或者Intellij IDEA中写好这个代码,然后通过IDE来运行这个代码的时候,会发生哪些事情吗?

首先,我们专栏最早的几篇文章就给大家说过,我们写好的代码他都是后缀为“.java”的源代码,这个代码是不能运行的。

所以第一步就是这份“.java”源代码文件必须先编译成一个“.class”字节码文件,这个字节码文件才是可以运行的,如下图所示。

接着对于这种编译好的字节码文件,比如HelloWorld.class,如果里面包含了main方法,接下来我们就可以用“java命令”来在命令行执行这个字节码文件了

实际上一旦你执行“java命令”,相当于就会启动一个JVM进程。这个JVM进程就会负责去执行你写好的那些代码,如下图所示。

所以首先要清楚第一点,运行一个Java系统,本质上就是启动一个JVM进程,这个JVM进程负责来执行你写好的一大堆代码。只要你的Java系统中包含一个main方法,接着JVM进程就会从你指定的这个main方法入手,开始执行你写的代码。

到底执行哪些代码:JVM得加载你写的类

Java是一个面向对象的语言,所以最最基本的代码组成单元就是一个一个的类,平时我们说写Java代码,不就是写一个一个的类吗?是不是。

然后在一个一个的类里我们会定义各种变量,方法,数据结构,通过if else之类的语法,写出来各种各样的系统业务逻辑,这就是所谓的编程了。

所以JVM既然要执行你写的代码,首先当然得把你写好的类加载到内存里来啊!

所以JVM的内存区域里大家都知道,有一块区域叫做永久代,当然JDK 1.8以后都叫做Metaspace了,我们也用最新的说法好了。

这块内存区域就是用来存放你系统里的各种类的信息的,包括JDK自身内置的一些类的信息,都在这块区域里。

JVM有类加载器和一套类加载的机制,我们在专栏最开始的时候都说过了,这里不再赘述,他会负责把我们写好的类从编译好的“.class”字节码文件里加载到内存里来,如下图。

好,那么既然有这么一块Metaspace区域是用来存放类信息的,那是不是有可能在这个Metaspace区域里就会发生OOM?

没错,是有这种可能的。

Java虚拟机栈:让线程执行各种方法

大家都知道,我们写好的那些Java代码虽然是一个一个的类,但是其实核心的代码逻辑一般都是封装在类里面的各种方法中的

比如JVM已经加载了我们写好的HelloWorld类到内存里了,接着怎么执行他里面的代码呢?

Java语言中的一个通用的规则,就是一个JVM进程总是从main方法开始执行的,所以我们既然在HelloWorld中写了一个main()方法,那么当然得执行这个方法中的代码了。

但是等一等,JVM进程里的谁去执行main()方法的代码?

其实我们所有的方法执行,都必须依赖JVM进程中的某个线程去执行,你可以理解为线程才是执行我们写的代码的核心主体。

JVM进程启动之后默认就会有一个main线程,这个main线程就是专门负责执行main()方法的。

大家如下图所示。

现在又有一个问题了,在main()方法里定义了一个局部变量,“message”,那么大家回忆一下,这些方法里的局部变量可能会有很多,那么这些局部变量是放在哪里的呢?

很简单,每个线程都有一个自己的虚拟机栈,就是所谓的栈内存。

然后这个线程只要执行一个方法,就会为方法创建一个栈桢,将栈桢放入自己的虚拟机栈里去,然后在这个栈桢里放入方法中定义的各种局部变量,如下图所示

好,现在问题来了,大家如果还记得之前我们讲过的一个参数,应该都知道,我们是可以设置JVM中每个线程的虚拟机栈的内存大小的,一般是设置为1MB。

那么既然每个线程的虚拟机栈的内存大小是固定的,是否可能会发生虚拟机栈的内存溢出?

没错,所以第二块可能发生OOM的区域,就是每个线程的虚拟机栈内存。

堆内存:放我们创建的各种对象

最后我们知道,我们写好的代码里,特别在一些方法中,可能会频繁的创建各种各样的对象,这些对象都是放在堆内存里的,如下图所示。

而且我们通过之前的学习,也都知道了一点,通常我们在JVM中分配给堆内存的空间其实一般是固定的

既然如此,我们还不停在堆内存里创建对象,是不是说明,堆内存也有可能会发生内存溢出?

没错,第三块可能发生内存溢出的区域,就是堆内存空间!

java程序员遇到的问题_Java 程序员平时最常遇到的故障:系统OOM (一)相关推荐

  1. java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...

    Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...

  2. Java需要掌握的底层知识_java程序员需要知道的底层知识(一)

    首先给自己一个介绍,本人是一个蠢笨蠢笨的女程序员,由于有一天突然觉悟了,想在学习的过程中写一些笔记,以前一直不敢开始这个事情,因为我害怕写错了,误导了别人,现在还是害怕,如果真的误导了同行,你们也轻点 ...

  3. java程序员遇到的问题_JAVA程序员最常遇见的10个异常

    程序员最不想遇到黑心老板外,异常也是难以不遇,现在列出10个最遇到的异常,大家可以参考一下. NO.1 java.lang.NullPointerException 这个异常大家肯定都经常遇到,异常的 ...

  4. java程序员就业发展方向_Java程序员有哪些职业发展方向?

    Java程序员的职业规划是非常清晰的,可以分为下面四种方向,可以根据自身条件选择适合自己的发展方向. A.程序员. 如果你觉得你喜欢代码,喜欢开发工作,那么一直做开发也是一件的不错的事,不过要考虑当你 ...

  5. java程序员必备英语词汇_java程序员常用英文单词整理

    java程序员常用英文单词整理 money 金钱 price 价格 totalPrice 总价格 change 改变.变化 Unicode 统一码 ASCII ascii码表 child 孩子 run ...

  6. java中10d是什么意思_java程序员面试自我介绍

    java程序员面试自我介绍 当面试考官随便地问你:"谈谈你自己的情况如何?"这是面试中的第一个问题.此刻,你应把在此之前所有紧张不安的情绪稳定下来.因为这个问题,应试者已经做了充分 ...

  7. java 数学公式解析框架有哪些_java程序员该如何进阶?这份java中高级核心知识全面解析请收好...

    <Java中高级核心知识全面解析>是整理收录GitHub50K+Star以上的高质量学习文档,前前后后花了近半个月的时间,终于整理而成.包含了Java基础.网络.Linux.数据结构与算法 ...

  8. java中级招聘要求怎么写_Java程序员如何进阶,一般招聘都有哪些要求?

    原标题:Java程序员如何进阶,一般招聘都有哪些要求? 作为当前市场上应用领域最广.人才需求最大的编程语言,Java一直是人们入行IT行业的选择.然而,随着大批量的人涌入Java开发行业,企业的招聘门 ...

  9. java程序员接私活_Java程序员接私活的项目-JeecgBoot

    Java程序员接私活的项目-JeecgBoot 近两年微服务大火,而对于Java程序员可实操的微服务框架就是SpringBoot,为什么大家都在使用微服务呢?- -第一,项目运行简单.相比较之前的 J ...

最新文章

  1. 设计模式(4)-序列生成器之单例模式
  2. DNS区域文件(Zone file)的serial数值命名规则
  3. 医疗在线服务InQuicker,融资0元年盈利400万美元!拒绝风投与炒作
  4. Could not create JarEntryRevision
  5. 文本多标签分类python_Scikitlearn多标签分类
  6. Android之AudioManager(音频管理器)详解
  7. 解读文献里的那些图——流式细胞术
  8. CentOS7 正确安装mysql(亲测)
  9. php怎么连接数据库6,PHP连接数据库的步骤
  10. wireshark 开始抓包
  11. 某盘视频网页播放视频修改播放速度代码
  12. 关于InnoDB索引长度限制的tips
  13. 对称密钥与非对称密钥算法
  14. css3+js生成任意正多边形棱柱
  15. 心跳信号分类---(中)
  16. android和平精英安装目录,和平精英文件目录在哪里 本体及安装包位置
  17. Pixel 手机遇到问题记录
  18. 解决最新版discuz安装模板插件提示“对不起,您安装的不是正版应用”
  19. 提高bp神经网络预测精度,bp神经网络数据预处理
  20. 一个故事一首歌——《枯叶之蝶…

热门文章

  1. 小程序实现瀑布流,获取图片高度分成两组数据的函数封装代码
  2. EJS 什么是EJS后缀文件 EJS怎么用
  3. 云计算开发要学习哪些东西?云计算开发的内容
  4. K-Means聚类算法原理
  5. 世界最大规模3D打印混凝土步行桥在上海 落成启用
  6. 安全的Web主机iptables防火墙脚本
  7. 当你学了现在的忘了前面的
  8. 系统设计与架构笔记:ETL工具开发和设计的建议
  9. NAT的配置与相关概念的理解
  10. Exchage 2007 Client Application Functions(2) -- 如何收取邮件