蓝盟IT外包,关于内存安全问题,你应该知道的地方!

发布者:上海IT外包来源:http://www.lanmon.net点击数:991

蓝盟IT小贴士,来喽!
内存管理
根据Java虚拟机规范(版本3 )的规定,Java虚拟机管理的内存包括以下可执行内存数据区域:
线程隔离数据区:
程序计数器:当前线程上正在执行的字节码的行号指示符
虚拟机堆栈:内部元素称为堆栈框架,包含局部变量表、操作堆栈、动态链接、方法出口等。 方法被调用到将与已完成执行的进程相对应的堆栈帧堆栈在虚拟机堆栈中的进程中。
本地方法堆栈:与虚拟机堆栈不同,虚拟机堆栈运行虚拟机的Java方法,而本地方法堆栈是虚拟机使用的本地本机方法服务。
线程共享数据区:
方法区域:可以描述为堆的逻辑部分,也可以使用永久世代实现方法区域。 存储数据,如虚拟机加载的类信息、常量、静态变量和由即时编译器编译的代码。
堆:唯一的目的是存储对象的实例,是垃圾回收管理器的主要区域,分为Eden、From/To  Survivor空间。
改进的Java各版本的内存管理
下图中的永久世代被理解为堆的逻辑区域。 删除永久世代的工作从JDK7开始,一些永久世代的数据(常量池)通过JDK7移动到堆中,JDK8直接删除永久世代,方法区域的大部分数据移动到堆中,剩下的元数据存储在元空间中。
内存溢出
内存泄漏Memory  Leak  :申请的内存空间无法立即释放,后续程序将永远占用该内容。
内存溢出Out  Of  Memory  :要求的内存超过了系统能够提供的内存
运行时数据区的常见异常
在JVM中,除了程序计数器外,在虚拟机存储器的其他几个运行时数据区也可能发生OOM异常。
堆内存溢出
不断创建对象,以保证从GC  Roots到对象的可到达路径,从而防止垃圾回收机制清除这些对象。
常见情况
通常,以下情况会导致工作中的内存问题:
传输数据量太多
由于传输数量太大,或者在极端的情况下,代码中间结果对象的数据量太大,或者太大,所以数据量会爆炸内存。
查询大量对象
这大多是对SQL语句设定问题,在SQL中没有设定分页,用户一次查询的数据量过多,如果频繁地查询SQL,则存储器会堆积,如果不进行空处理,则WHERE条件会变空,从而查询大数据量
原因是接口问题
该类由于外部接口性能慢、占用内存大、短时间内QPS高,导致服务器内存不足,线程堆积或挂起,从而产生FullGC。元空间问题
Java字节码访问器使用大量的反射代码不断生成类。
文/上海蓝盟  IT外包专家
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部