测试参数设置:

1、循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space,

虚拟机参数:-Xms1M -Xmx1M -XX:+HeapDumpOnOutOfMemoryError,解释:将-Xmx和-Xms设置为一样可以避免堆自动扩展,-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的堆内存转储快照

1
2
3
//        while (true){
//            new A().do2();
//        }

2、循环调用对象引用的方式实现栈溢出。java.lang.StackOverflowError,

虚拟机参数:-Xss128k,

解释:设置虚拟机栈的大小为128kn

在单线程下,无论栈帧太大还是虚拟机栈容量太小,内存无法分配的时候都会抛出以上错误

1
2
3
void do2(){
    do2();
};

3、循环调用String.intern()方法来写入常量池,常量池溢出。java.lang.OutOfMemoryError: PermGen space

1
2
3
4
while (true)
      {
          list.add(String.valueOf(i++).intern());
      }

虚拟机参数:-XX:PermSize=10M -XX:MaxPermSize=10M,

解释:表示JVM初始分配的永久代的容量和最大容量。(永久区内存不足,1.8后都在堆上。方法区=永久代,PermGen space”,即永久代)

  • 四种引用状态:(类继承extends WeakReference<Car>)

1、强引用:Object obj = new Object(),只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象;

2、软引用:SoftReference,被软引用关联的对象会在内存不够时被回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常;SoftReference<byte[]> sr = new SoftReference<byte[]>(bytes);

3、弱引用:WeakReference,被弱引用关联的对象只能生存到下一次垃圾回收之前;

4、虚引用:PhantomReference,虚引用是用于跟踪对象的回收状态。

触发GC的时机:

1、当年轻代或者老年代满了,Java虚拟机无法再为新的对象分配内存空间了,那么Java虚拟机就会触发一次GC去回收掉那些已经不会再被使用到的对象

2、System.gc(),Runtime.getRuntime().gc()方法,通常这样会触发一次的Full GC以及至少一次的Minor GC,不一定就立即回收。

3、在当前服务器空闲或堆中老年代等占用率较大时触发。

回收无引用对象占据的空间,而不是对象本身。

但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的(未开源),这和抢占式的线程在发生作用时的原理一样。

分代收集算法:

新生代收集器和老年代收集器。

标记-清除算法

标记-整理算法

内存溢出和内存泄露的区别:

1、内存溢出:程序在分配内存的时候没有足够大的空间了。

2、内存泄漏:程序在申请内存之后,没有办法释放掉内存,它始终占用着内存,即被分配的对象可达但无用。内存泄露一般都是因为内存中有一块很大的对象,但是无法释放。            会导致内存溢出。

并行与并发:

1、并行:指多条垃圾收集器线程运行;

2、并发:指用户线程和垃圾收集器线程同时工作。

类加载机制:

1、加载(生成java.lang.class对象)、验证、准备、解析、初始化(赋值过程)、使用(Using)和卸载(Unloading)这7个阶段

2、其中验证(字节流包含的信息是否正确,是否符合jvm)、

准备(为类变量即静态变量赋值,赋0)、

解析(将符号引用替换为直接引用,class文件转内存)3个部分统称为连接(Linking)

3、加载阶段:获取.class文件的二进制流;

将类信息、静态变量、字节码、常量这些.class文件中的内容放入方法区

在内存中生成一个代表这个.class文件的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

4、初始化阶段做的事就是调用client>方法给static变量赋予用户指定的值以及执行静态代码块。

双亲委派模型:(启动类加载器>扩展类加载器>应用程序类加载器>自定义类加载器)

一个类加载器收到了类加载的请求,把这个请求委派给父类加载器去完成,父类完不成,自己才去完成。

先行发生原则:

Java内存中的有序性仅仅依靠synchronized和volatile来约束是不行,依靠程序调用次序规则判断setter和getter顺序。

Minor GC :  清理年轻带内存, 无法为一个新的对象分配空间。

Major GC : 是清理老年代,许多 Major GC 是由 Minor GC 触发的

Full GC : 是清理整个堆空间—包括年轻代和老年代

java虚拟机内存溢出和泄漏实例的更多相关文章

  1. Java虚拟机内存溢出异常--《深入理解Java虚拟机》学习笔记及个人理解(三)

    Java虚拟机内存溢出异常--<深入理解Java虚拟机>学习笔记及个人理解(三) 书上P39 1. 堆内存溢出 不断地创建对象, 而且保证创建的这些对象不会被回收即可(让GC Root可达 ...

  2. java虚拟机内存溢出各种场景总结

    java堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且保证gc roots到对象之间有可达路径来避免垃圾回收机制来清楚这些对象,那么在 对象到达最大堆的容量限制后就会产生内存溢出溢出. ...

  3. 如何设置Java虚拟机内存以适应大程序的装载

    Java虚拟机对于运行时的程序所占内存是有限制的,当我们的项目或者程序很大时,往往会照成内存溢出. 举个例子: public class SmallTest1 { public static void ...

  4. 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

    一.Java虚拟机内存区域如何划分 1.Java虚拟机内存区域的划分 区域名称 作用(用途) 类型 特点 虚拟机规定异常情况 内存分配与回收 其他说明 1 程序计数器 指示当前正在执行的字节码指令地址 ...

  5. Java虚拟机内存区域堆(heap)的管理

    在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域 ...

  6. Java虚拟机-内存tips

    java虚拟机内存可以分为独占区和共享区. 独占区:虚拟内存栈.本地方法栈.程序计数器. 共享区:方法区.Java堆(用来存放对象实例). 程序计数器 比较小的内存空间,当前线程所执行的字节码的行号指 ...

  7. JVM基础系列第6讲:Java 虚拟机内存结构

    看到这里,我相信大家对于一个 Java 源文件是如何变成字节码文件,以及字节码文件的含义已经非常清楚了.那么接下来就是让 Java 虚拟机运行字节码文件,从而得出我们最终想要的结果了.在这个过程中,J ...

  8. 总结Java虚拟机内存区域模型

    本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...

  9. Java虚拟机内存分配详解

    简介 了解Java虚拟机内存分布的好处 1.了解Java内存管理的细节,有助于程序员编写出性能更好的程序.比如,在新的线程创建时,JVM会为每个线程创建一个专属的栈 (stack),其栈是先进后出的数 ...

随机推荐

  1. CSS 发明者 Håkon Wium Lie 访谈--csdn zhangxin09

    原文地址:https://dev.opera.com/articles/css-twenty-years-hakon/ ---------------------------------------- ...

  2. 基于GPU加速的三维空间分析【转】

    基于GPU加速的三维空间分析 标签:supermap地理信息系统gisit 文:李凯 随着三维GIS 的快速发展和应用普及,三维空间分析技术以其应用中的实用性成为当前GIS技术研究的热点领域.面对日益 ...

  3. 以面试官的角度看strcpy函数

    一:笔试或者面试的总结 之 一 (1)在笔试或者面试中常常会被问道,strcpy  memmove memcpy 函数的实现.有时也会问你STL 中string的 split 和 trim的实现.有的 ...

  4. 推荐一款免费的SQLsever的备份软件sqlBackupAndFtp

    官方网址  http://sqlbackupandftp.com/ 这个软件不错,蛮方便的.小巧使用,还能够FTP上传数据.

  5. java new一个接口到底要做什么

    转自:http://www.cnblogs.com/yjmyzz/p/3448330.html java中的匿名类有一个倍儿神奇的用法,见下面代码示例: 1 package contract; 2 3 ...

  6. # kubernetes调度之nodeName与NodeSelector

    系列目录 Kubernetes的调度有简单,有复杂,指定NodeName和使用NodeSelector调度是最简单的,可以将Pod调度到期望的节点上. 本文主要介绍kubernetes调度框架中的No ...

  7. caffe搭建--WINDOWS+VS2013下生成caffe并进行cifar10分类测试

    http://blog.csdn.net/naaaa/article/details/52118437 标签: windowsvs2013caffecifar10 2016-08-04 15:33 1 ...

  8. 搭建mysql主从集群的步骤

    前提条件是:须要在linux上安装4个mysql数据库,都须要配置完对应的信息. 须要搭建: mysql 01: 主数据库  master                  mysql 02 :   ...

  9. Unable to run Kiwi tests on iOS8 device

    本文转载至 http://stackoverflow.com/questions/25871601/unable-to-run-kiwi-tests-on-ios8-device 5down vote ...

  10. 1185: [HNOI2007]最小矩形覆盖

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1426  Solve ...