java程序员遇到的问题_Java 程序员平时最常遇到的故障:系统OOM (一)
作为 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 nio 之MappedByteBuffer,高效文件/内存映射
http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer。 MappedByteBuffer是java nio引入的文件内存映射方案…

HTML5 Canvas编写五彩连珠(3):设计
在看了几篇Canvas相关的文章后,发现前两节的代码实现还是有问题,因为知道的少,所以只能在自己已知的知识上做实现。不过还好,这是一个发现的过程,也是一个纠错和完善的过程。我第一次尝试一边学习一遍写博客࿰…

SQL面试宝典一:
1.什么是sql Injection(sql 注入)?如何防止? 答:是一种恶意将sql代码添加到输入参数中,传递到sql服务器解析并执行的一种攻击手法。 防止:1.对用户的输入进行校验,可以通过正则表达…

java注解的执行顺序_深入理解Spring的@Order注解和Ordered接口
前言Spring的Order注解或者Ordered接口大家都知道是控制顺序的,那么它们到底是控制什么顺序的?是控制Bean的注入顺序,还是Bean的实例化顺序,还是Bean的执行顺序呢?那么我们先直接给出结论再来验证结论。结论࿱…

数据驱动安全需三大核心新技术
要做到数据驱动安全,齐向东认为需要三大核心技术。第一个核心技术是大数据采集器,第二个是大数据引擎,第三个是机器学习挖掘、重要安全问题定位准确。转载于:https://www.cnblogs.com/1992825-Amelia/p/4854220.html

[转]BI 问答
http://blog.bridata.ca/?cat16 前几天Post 了一些BI 的面试问题,感兴趣的人很多,有很多人问我答案以此来评估一下自己的知识水平。坦白地说我没有写在纸上的具体答案,事实上每个问题也没有具体和精确的答案,所谓面试就不是笔试&…

没有学不会的C++:用户自定义的隐式类型转换
C 中的类型转换包含内建类型的转换和用户自定义类型的转换,而这两者都又可分为隐式转换和显示转换,所以一共有如下四象限表格中的 A、B、C、D 四种情况 隐式转换显示转换(casting)内建类型转换 (int, float ...)AB用户自定义类型转换(类 vs 类; 类 vs 内…

python scrapy菜鸟教程_scrapy学习笔记(一)快速入门
安装ScrapyScrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv、json等文件中。首先我们安装Scrapy。pip install scrapy在Windows上安装时可能会出现错误,提示找不到Microsoft Visual C。这时候我们…

执行eclipse,迅速failed to create the java virtual machine。
它们必须在一排,否则会出现The Eclipse executable launcher was unable to locate its companion shared library的错误 打开eclipse文件夹下的eclipse.ini文件。改动–launcher.XXMaxPermSize属性,当中此属性有两处 -startup plugins/org.eclipse.equi…

vue打包后图片找不到情况
打包之前需要修改如下配置文件: 配置文件一:build>>>utils.js (修改publicPath:"../../" , 这样写是处理打包后找不到静态文件(图片路径失效)的问题) 配置文件二:config>>>index.js(修改a…

UBUNTU安装SSH和xrdp
一、安装SSH,通过PUTTY访问 命令:sudo apt-get install ssh 查看:netstat -l 二、安装xrdp,通过远程桌面访问 命令:sudo apt-get install xrdp 开启远程桌面访问权限 系统-->首选项-->remote desktop 三、去掉远…

python中opencv中inrange用法_python-opencv中的cv2.inRange函数
本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分具体就调用了cv2的两个函数,一个是rgb转hsv的函数具体用法hsv cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)然后利用cv2.inRange函数设阈值,去除背景部分mask cv2…

[转]C++11 随机数学习
相对于C 11之前的随机数生成器来说,C11的随机数生成器是复杂了很多。这是因为相对于之前的只需srand、rand这两函数即可获取随机数来说,C11提供了太多的选择和东西。 随机数生成算法: 随机数生成算法有很多,C11之前的C/C只…

Linux Shell ssh登录脚本
Linux 登陆服务器敲命令太多,某时候确实不便,所以就用shell写了一个 我的blog地址: http://www.cnblogs.com/caoguo 一.说明 支持秘密和密钥两种格式用户名和密码都是写文件的,明文保存二.配置 密码文件配置:序号:IP:端口:用户:密码:说明 1:192.168.88.128:22:root:toor:虚拟机…

C# 温故而知新:Stream篇(二)
C# 温故而知新:Stream篇(二) TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简单介绍下Encoding 编码 StreamReader 的定义及作用 S…

usaco Pollutant Control
第一问是求最小割。第二问求最小割中集合中边最少的集合的大小。 第三问求集合中边最少且字典序最小的边的下标。 第一问直接求最大流就能解,第二问将原来的边的容量都改为1,求出来的最大流就是元素最少的一个最小割的大小。 将容量都改为1之后ÿ…

洛谷P4705 玩游戏(生成函数+多项式运算)
题面 传送门 题解 妈呀这辣鸡题目调了我整整三天……最后发现竟然是因为分治\(NTT\)之后的多项式长度不是\(2\)的幂导致把多项式的值存下来的时候发生了一些玄学错误……玄学到了我\(WA\)的点全都是\(WA\)在\(2\)的幂次行里…… 看到这种题目二话不说先推倒 \[ \begin{aligned}…

blast程序 介绍 简介
每次找都挺麻烦,又记不住,于是抄下来: blastp:将待查询的蛋白质序列及其互补序列一起对蛋白质序列数据库进行查询;blastn:将待查询的核酸序列及其互补序列一起对核酸序列数据库进行查询;blastx:先将待查询的核酸序列按…

java泛型的实现和原理_java 泛型实现原理
泛型思想最早在C语言的模板(Templates)中产生,Java后来也借用了这种思想。虽然思想一致,但是他们存在着本质性的不同。C中的模板是真正意义上的泛型,在编译时就将不同模板类型参数编译成对应不同的目标代码,List和List是两种不同的…

java out of range_关于Parameter index out of range求解决办法
程序:提示参数越界,但我实在不知道我到底哪里越界了。明明该我那样写的嘛。求高手帮我看看,现在我是弄得我有气无力了!要死了。在去死亡的路上等着你帮帮我!Document : replyokCreated on : 2008-9-29, 6:05:31Autho…

FineReport——权限分配以及自定义首页
权限分配可以有两种方法,第一种方法是根据部门职位分配权限,第二种是根据角色分配权限; FR自带有三个JQ对象,用以保存用户名参数/角色参数/部门参数——$fr_username/$fr_authority/$fr_userposition 根据部门职位: 以…

去掉[]中的英文(正则表达式)C#
这个问题本来是以为信息科技大学的老师问蒋委员长的问题,蒋委员长用正则表达式完成了这个问题 1,问题的情况有哪些? abc[abc]abc,abc[-abc]abc,abc[一abc]abc,abc[一abc一]abc等等. 2,问题的解决目标? 写一个通用的方法来完成提出的问题. 3,解决方案 -->正则表达式方法 其…

Event Loop
事件队列 Javascript是单线程,单线程就意味着所有任务需要排队。然后会将所有任务分成两类:同步任务和异步任务!同步任务:在主线程上执行的任务,只有前一个任务执行完成,才会执行后一个!异步任务…

java makefile jar包_java makefile学习实践(编译的javac命令写在makefile中,运行命令java写在shell脚本中)...
学习makefile教程,ubuntu中文网1.写一个简单的java项目,不需要外部jar,用的简单的importjava.util.ArrayList;是可以从CLASSPATH环境变量中找到的,在javac阶段不需要特殊添加-cphellocatHellocat.javaimportjava.util.ArrayList;importjava.u…

Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :) 请注意本文关于Python的内容仅适用于2.x&a…

《编写有效用例》读书笔记1
第一章 引言 本章主要介绍用例是什么样子的,并描述为什么不同的项目组需要采用不同 的用例编写风格以及在什么地方使用用例有利于做需求收集工作,也让我们了解 在编写用例之前,需要做哪些准备工作。 用例是代表系统中各个项目相关人员之间就系…

顺序结构,判断结构 if,switch
1:顺序结构:从上往下执行程序代码,为顺序结构 ---------------------------------------------------------------------- 2:判断结构: if 如果 判断是两个选择一个,要么对要么错 if中的条件表达式 返回…

php转换文字Unicode,php实现将中文转为unicode的方法
相关函数说明:iconv命令是用来转换文件的编码方式的,比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。str_split() 函数把字符串分割到数组中。bin2hex() 函数把 ASCII 字符的字符串转换为十六进制值。字符串可通过使用 pack() 函数再…

kail安装和vmtools安装
因位太费劲我直接把我做的Word文档直接上传了,如果想安装可以下载,我就不麻烦在写一遍了,这个教程主要给小白讲的,大佬请绕过 kail安装教程.docx https://pan.wps.cn/l/sm43o7f 密码:f43341转载于:https://www.cnblogs…

Windows计数器做性能监控(window server 2008服务器)
使用Windows计数器 一、创建数据收集器集 二、创建数据收集器 三、使用数据收集器 1、修改数据收集器的属性 2、手动启用、手动停止数据收集器集 3、计划任务 4、在性能监视器中查看 一、性能监视器 Windows 服务器操作系统提供一个名为“性能监视器”的图形工具,可…