为了更直接的了解各区域,下面我们来看几个示例。

1、Java 堆溢出

下面的程中我们限制Java 堆的大小为20MB,不可扩展(将堆的最小值-Xms 参

数与最大值-Xmx 参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDump

OnOutOfMemoryError 可以让虚拟机在出现内存溢出异常时Dump 出当前的内存堆转储

快照以便事后进行分析。

参数设置如下


 

 

Java 堆内存的OutOfMemoryError异常是实际应用中最常见的内存溢出异常情况。出现Java 堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示“Java heap space”。要解决这个区域的异常,一般的手段是首先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump 出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。图2-5 显示了使用Eclipse Memory Analyzer 打开的堆转储快照文件。

如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots 的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots 相关联并导致垃圾收集器无法自动回收

它们的。掌握了泄漏对象的类型信息,以及GC Roots 引用链的信息,就可以比较准确地定位出泄漏代码的位置。

如果不存在泄漏,换句话说就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xmx 与-Xms),与机器物理内存对比看是否还可以调大,从代码上

检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。

以上是处理Java 堆内存问题的简略思路,处理这些问题所需要的知识、工具与经验在后面的几次分享中我会做一些额外的分析。

2、java栈溢出

  1. package com.yhj.jvm.memory.stack;
  2. /**
  3. * @Described:栈层级不足探究
  4. * @VM args:-Xss128k
  5. * @author YHJ create at 2011-11-12 下午08:19:28
  6. * @FileNmae com.yhj.jvm.memory.stack.StackOverFlow.java
  7. */
  8. public class StackOverFlow {
  9. private int i ;
  10. public void plus() {
  11. i++;
  12. plus();
  13. }
  14. /**
  15. * @param args
  16. * @Author YHJ create at 2011-11-12 下午08:19:21
  17. */
  18. public static void main(String[] args) {
  19. StackOverFlow stackOverFlow = new StackOverFlow();
  20. try {
  21. stackOverFlow.plus();
  22. } catch (Exception e) {
  23. System.out.println("Exception:stack length:"+stackOverFlow.i);
  24. e.printStackTrace();
  25. } catch (Error e) {
  26. System.out.println("Error:stack length:"+stackOverFlow.i);
  27. e.printStackTrace();
  28. }
  29. }
  30. }

3、 方法区溢出

  1. package com.yhj.jvm.memory.methodArea;
  2. import java.lang.reflect.Method;
  3. import net.sf.cglib.proxy.Enhancer;
  4. import net.sf.cglib.proxy.MethodInterceptor;
  5. import net.sf.cglib.proxy.MethodProxy;
  6. /**
  7. * @Described:方法区溢出测试
  8. * 使用技术 CBlib
  9. * @VM args : -XX:PermSize=10M -XX:MaxPermSize=10M
  10. * @author YHJ create at 2011-11-12 下午08:47:55
  11. * @FileNmae com.yhj.jvm.memory.methodArea.MethodAreaOutOfMemory.java
  12. */
  13. public class MethodAreaOutOfMemory {
  14. /**
  15. * @param args
  16. * @Author YHJ create at 2011-11-12 下午08:47:51
  17. */
  18. public static void main(String[] args) {
  19. while(true){
  20. Enhancer enhancer = new Enhancer();
  21. enhancer.setSuperclass(TestCase.class);
  22. enhancer.setUseCache(false);
  23. enhancer.setCallback(new MethodInterceptor() {
  24. @Override
  25. public Object intercept(Object arg0, Method arg1, Object[] arg2,
  26. MethodProxy arg3) throws Throwable {
  27. return arg3.invokeSuper(arg0, arg2);
  28. }
  29. });
  30. enhancer.create();
  31. }
  32. }
  33. }
  34. /**
  35. * @Described:测试用例
  36. * @author YHJ create at 2011-11-12 下午08:53:09
  37. * @FileNmae com.yhj.jvm.memory.methodArea.MethodAreaOutOfMemory.java
  38. */
  39. class TestCase{
  40. }
 
4、常量池溢出(常量池都有哪些信息,我们在后续的JVM类文件结构中详细描述) 
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. /**
  4. * @Described:常量池内存溢出探究
  5. * @VM args : -XX:PermSize=10M -XX:MaxPermSize=10M
  6. * @author YHJ create at 2011-10-30 下午04:28:30
  7. * @FileNmae com.yhj.jvm.memory.constant.ConstantOutOfMemory.java
  8. */
  9. public class ConstantOutOfMemory {
  10. /**
  11. * @param args
  12. * @throws Exception
  13. * @Author YHJ create at 2011-10-30 下午04:28:25
  14. */
  15. public static void main(String[] args) throws Exception {
  16. try {
  17. List<String> strings = new ArrayList<String>();
  18. int i = 0;
  19. while(true){
  20. strings.add(String.valueOf(i++).intern());
  21. }
  22. } catch (Exception e) {
  23. e.printStackTrace();
  24. throw e;
  25. }
  26. }
  27. }

5、直接内存溢出

  1. package com.yhj.jvm.memory.directoryMemory;
  2. import java.lang.reflect.Field;
  3. import sun.misc.Unsafe;
  4. /**
  5. * @Described:直接内存溢出测试
  6. * @VM args: -Xmx20M -XX:MaxDirectMemorySize=10M
  7. * @author YHJ create at 2011-11-12 下午09:06:10
  8. * @FileNmae com.yhj.jvm.memory.directoryMemory.DirectoryMemoryOutOfmemory.java
  9. */
  10. public class DirectoryMemoryOutOfmemory {
  11. private static final int ONE_MB = 1024*1024;
  12. private static int count = 1;
  13. /**
  14. * @param args
  15. * @Author YHJ create at 2011-11-12 下午09:05:54
  16. */
  17. public static void main(String[] args) {
  18. try {
  19. Field field = Unsafe.class.getDeclaredField("theUnsafe");
  20. field.setAccessible(true);
  21. Unsafe unsafe = (Unsafe) field.get(null);
  22. while (true) {
  23. unsafe.allocateMemory(ONE_MB);
  24. count++;
  25. }
  26. } catch (Exception e) {
  27. System.out.println("Exception:instance created "+count);
  28. e.printStackTrace();
  29. } catch (Error e) {
  30. System.out.println("Error:instance created "+count);
  31. e.printStackTrace();
  32. }
  33. }
  34. }

【深入Java虚拟机】之三:内存溢出的更多相关文章

  1. 深入理解java虚拟机【内存溢出实例】

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

  2. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  3. java虚拟机涉及内存溢出

    Java语言写的代码是.java文件,它会被特定程序编译(javac.exe,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行 ...

  4. Java 虚拟机的内存溢出

    在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生 OutOfMemoryError 异常的可能. 在Eclipse中进行JVM参数设置 可以直接通过上方菜单栏的 ...

  5. java虚拟机(四)--内存溢出、内存泄漏、SOF

    学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...

  6. 【java虚拟机】内存溢出与内存泄漏

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7354857.html 一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提 ...

  7. 【java虚拟机】内存溢出解决思路

    转自:https://blog.csdn.net/u013521220/article/details/79523633 内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知 ...

  8. (一)深入java虚拟机之内存溢出与分析

    一.内存溢出程序 public class Test { public static void main(String[] args) { List<User> userList=new ...

  9. 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...

  10. 实战Java虚拟机之三“G1的新生代GC”

    今天开始实战Java虚拟机之三:“G1的新生代GC”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...

随机推荐

  1. 安装PackageControl

    安装PackageControl 1,到PackageControl官网,查找到相应sublime text的版本安装信息, sublime text 3: import urllib.request ...

  2. 异步加载js的三种方法

    js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...

  3. 快速数论变换(NTT)小结

    NTT 在FFT中,我们需要用到复数,复数虽然很神奇,但是它也有自己的局限性--需要用double类型计算,精度太低 那有没有什么东西能够代替复数且解决精度问题呢? 这个东西,叫原根 原根 阶 若\( ...

  4. Java中的会话Cookie&&Session

    会话技术 会话: 一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求之间共享数据 方式: 客户端会话技术:coo ...

  5. Snapde怎么添加行和列

    Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏.那么它是如何添加行列的呢? 它有三种方法可以添加: 1.在编辑下拉菜单下找到设置行列数菜 ...

  6. android引用arr包

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/9939494.html android中引用的包一般分为两种: 1.jar包 2.aar包 arr包其实带 ...

  7. C# 利用SharpZipLib生成压缩包

    本文通过一个简单的小例子简述SharpZipLib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正. 什么是SharpZipLib ? SharpZipLib是一个C#的类库,主要用来解压 ...

  8. webmagic 爬取网页所有文章的标题时间作者和内容

    package com.ij34; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Page; import us.co ...

  9. 某jiub笔试

    一.选择题 1.下列说法正确的有()A. class中的constructor不可省略B. constructor必须与class同名,但方法不能与class同名C.constructor在一个对象被 ...

  10. 产品设计-后台管理权限设计RBAC

    最近在做OA系统,设计到不同的员工会拥有不同权限对OA进行操作,总结了一下整体的设计 做权限的分配就是为了更好的管理不同类别的员工,如人事部可以看到普通员工的薪酬,可以查看全部员工的考勤数据请假等,而 ...