常见的内存溢出的三种情况:
1)JVM Heap(堆) 溢出: java.lang.OutOfMemoryError: Java heap space
JVM 在启动的时候会自动设置 JVM Heap 的值, 可以利用 JVM 提供的 - Xmn -Xms -Xmx 等选项可进行设置. Heap 的大小是 Young Generation 和 Tenured Generaion 之和. 在 JVM 中如果 98% 的时间是用于 GC, 且可用的 Heap size 不足 2% 的时候将抛出此异常信息.
解决方法: 手动设置 JVM Heap(堆) 的大小.
2)PermGen space 溢出: java.lang.OutOfMemoryError: PermGen space
PermGen space 的全称是 Permanent Generation space, 是指内存的永久保存区域. 为什么会内存溢出, 这是由于这块内存主要是被 JVM 存放 Class 和 Meta 信息的, Class 在被 Load 的时候被放入 PermGen space 区域, 它和存放 Instance 的 Heap 区域不同, sun 的 GC 不会在主程序运行期对 PermGen space 进行清理, 所以如果你的 App 会载入很多 CLASS 的话, 就很可能出现 PermGen space 溢出. 一般发生在程序的启动阶段.
解决方法: 通过 - XX:PermSize 和 - XX:MaxPermSize 设置永久代大小即可.
3) 栈溢出: java.lang.StackOverflowError: Thread Stack space
栈溢出了, JVM 依然是采用栈式的虚拟机, 这个和 C 和 Pascal 都是一样的. 函数的调用过程都体现在堆栈和退栈上了. 调用构造函数的 "层" 太多了, 以致于把栈区溢出了. 通常来讲, 一般栈区远远小于堆区的, 因为函数调用过程往往不会多于上千层, 而即便每个函数调用需要 1K 的空间 (这个大约相当于在一个 C 函数内声明了 256 个 int 类型的变量), 那么栈区也不过是需要 1MB 的空间. 通常栈的大小是 1-2MB 的. 通俗一点讲就是单线程的程序需要的内存太大了. 通常递归也不要递归的层次过多, 很容易溢出.
解决方法: 1: 修改程序. 2: 通过 -Xss: 来设置每个线程的 Stack 大小即可.
本文的重点是你有没有收获与成长, 其余的都不重要, 希望读者们能谨记这一点. 同时我经过多年的收藏目前也算收集到了一套完整的学习资料, 包括但不限于: 分布式架构, 高可扩展, 高性能, 高并发, Jvm 性能调优, Spring,MyBatis,Nginx 源码分析, Redis,ActiveMQ,,Mycat,Netty,Kafka,MySQL,Zookeeper,Tomcat,Docker,Dubbo,Nginx 等多个知识点高级进阶干货, 希望对想成为架构师的朋友有一定的参考和帮助
喜欢这篇文章的朋友可以点个喜欢, 也可以关注一下我的个人专题: Java 成长之路
需要更详细架构师技能思维导图和以下资料的可以加一下技术交流分享群:"708 701 457" 免费获取
来源: http://www.jianshu.com/p/4aa8089e6004