1.Java内存区域与内存溢出异常

虚拟机栈:为虚拟机执行Java方法服务

本地方法栈:为虚拟机使用到的native方法服务。

Java堆:是Java虚拟机所管理的内存中最大的一块,被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。是垃圾收集器管理的主要区域。

可以通过-Xmx和-Xms控制堆的大小。

方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

内存溢出异常(OutOfMemoryError):

虚拟机栈:如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存。

Java堆:如果在堆中没有内存完成实例分配,并且堆也无法再扩展时。

方法区:当方法区无法满足内存分配需求时。当方法区中的常量池无法再申请到内存时。

2.垃圾收集器与内存分配策略

如何判断一个对象是否可回收呢?

可达性分析算法:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径(称为引用链),当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可用的。

如何宣判一个对象的死刑呢?

即使是在可达性算法中的不可达对象,也并非是非死不可的,此时它们暂时处于缓刑阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:第一次就是执行可达性算法后,若一个对象和任何其他对象没有关联就会标记一次。然后判断该对象是否重写了finalize()方法,若该对象没有重写,或者已经执行过那么会进行第二次标记,两次标记后确立其死刑,对象可在finalize()方法内进行一次自我救赎的机会。但是注意,finalize方法只会被执行一次。

垃圾收集算法:

标记-清除算法(最基础的算法):

首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。但是效率低且易产生大量不连续的内存碎片。

复制算法:

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存使用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间清理掉。

标记-整理算法:

首先标记处所有需要回收的对象,在标记完成后将需要回收的对象向一端移动,然后直接清理掉端边界以外的内存。

分代收集算法:

根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或者“标记-整理”算法来进行回收。

默认使用的垃圾收集器:Serial/Serial Old收集器

对象的内存分配策略:

新建一个对象一般来讲会先存入新生代中的Eden中,若是大对象则直接存入老年代,当Eden内存满后,会根据复制算法将Eden中的存活对象复制到Survivor空间内,并执行一次minorGC,将Eden空间清空,若是老年代没有足够的内存进行分配时就会执行一次FullGC,一般来讲FullGC都会伴随着一次MinorGC,但是要比MinorGC慢10倍以上。若是一个对象在survivor空间内经历过了15次的MinorGC还不死,就会将该对象转存至老年代。

3.虚拟机类加载机制

概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

加载-->验证-->准备-->解析-->初始化-->使用-->卸载

JVM虚拟机内存溢出垃圾收集及类加载机制总结的更多相关文章

  1. 对jvm虚拟机 内存溢出的思考

    java内存溢出:当新产生对象时,新生代空间不够,导致无法申请到足够的空间,报内存溢出 内存泄漏:一些静态集合,静态常量没有被gc清理,越来越多,占用内存,最后导致无法申请到新的空间

  2. jvm 虚拟机内存模型

    来源:https://blog.csdn.net/A_zhenzhen/article/details/77917991?locationNum=8&fps=1    https://blog ...

  3. 设置TOMCAT的JVM虚拟机内存大小

    你知道如何设置TOMCAT的JVM虚拟机内存大小吗,这里和大家分享一下,JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序.这个初始内存和最大内存在一定程度都会影响程序的性能. 设置 ...

  4. JVM虚拟机深入理解+GC回收+类加载

    旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81455449 一,前言 本文章是读了“深入理 ...

  5. java中JVM虚拟机内存模型详细说明

    java中JVM虚拟机内存模型详细说明 2012-12-12 18:36:03|  分类: JAVA |  标签:java  jvm  堆内存  虚拟机  |举报|字号 订阅     JVM的内部结构 ...

  6. 巩固java(二)----JVM堆内存结构及垃圾回收机制

    前言:        我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构   ...

  7. JVM 虚拟机内存深入探究

    [<深入理解java虚拟机>-整理笔记] by  lijun JVM虚拟机内存逻辑模型: 方法区(全局变量 静态数据 常量等) 线程共享 堆栈区(对象实例 数组数据 new generat ...

  8. JVM:内存溢出OOM

    JVM:内存溢出OOM 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 经典错误 JVM 中常见的两个 OOM 错误 StackoverflowError:栈溢出 ...

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

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

随机推荐

  1. 自己写了一个mysql连接的工具类【java】

    要用的话,包名自己可以改一下: package com.usa3v.dreamcenter.util; import java.sql.Connection; import java.sql.Driv ...

  2. 基于bs4库的HTML内容查找方法

    一.信息提取实例 提取HTML中所有的URL链接 思路:1)搜索到所有的<a>标签 2)解析<a>标签格式,提取href后的链接内容 >>> import r ...

  3. MongoDB - 将查询结果保存到excel文件中

    import pymongo import re client = pymongo.MongoClient('127.0.0.1', 27017) db_name = 'Trade' db = cli ...

  4. 初始css一

    初始CSS 一.form表单补充 form表单关键性的属性补充 form表单 关键性的属性 action 控制的是数据的提交路径 1.不写 默认是朝着当前页面所在的地址提交 2.全路径 3.后缀(/i ...

  5. JSAJAX请求

    let xmlHttp = new XMLHttpRequest();//创建发送请求的对象     //这是为了兼容IE的获取ajac请求对象的方法     // let getXmlHttpReq ...

  6. 台电X16pro刷机记录

    Android: 如果要刷安卓,需要使用win7系统电脑,且需要安装java环境,同时按住 音量减+电源键进入刷机模式(DNX BOOT MODE..),这时在PhoneFlashTool_5.3.2 ...

  7. HeroM2连击技能设置和DB完整数据

    连击技能设置: M2\选项\功能设置\技能魔法\通用技能\连击技能 魔法DB: 81;倚天辟地;0;55;5;10;10;5;6;6;99;15;5;15;10;15;15;60;; 300;万剑归宗 ...

  8. ASP.NET Core搭建多层网站架构【3-xUnit单元测试之简单方法测试】

    2020/01/28, ASP.NET Core 3.1, VS2019, xUnit 2.4.0 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构[3-xUnit单元测试 ...

  9. Java入门笔记 09-集合

    一.Collection接口方法:Collection 接口是 List.Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集 ...

  10. 6.Python字符串

    #header { display: none !important; } } #header-spacer { width: 100%; visibility: hidden; } @media p ...