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. 关于C++指针、引用和const关键字的各种关系

    #include <stdio.h> #include<iostream> using namespace std; typedef char *new_type; int m ...

  2. Python3问题TypeError: object() takes no parameters

    1. Python中关键字变量和特殊函数,都是以__xxx__来表示的 初学Python的朋友,需要注意其中变量名中前后是有两个下划线(_)的,如果不注意,调用内部关键字变量和特殊函数时,将会出现错误 ...

  3. SPRING MICROSERVICES IN ACTION

    What is microservice 背景 在微服务的概念成型之前,绝大部分基于WEB的应用都是使用单体的风格来进行构建的.在单体架构中,应用程序作为单个可部署的软件制品交付,所有的UI(用户接口 ...

  4. 解决<%@taglib prefix="s" uri="/struts-tags"%>显示找不到

    问题: jsp中使用<%@taglib prefix="s" uri="/struts-tags"%>显示找不到 解决方法: 在web.xml中插入 ...

  5. Mac 配置 React Native 环境

    OSX系统,这里假定你是iOS开发人员 Homebrew 是需要的,只有安装了Homebrew才能继续安装watchman和flow 安装 Node.js 4.0 或者更新的版本. 使用 Homebr ...

  6. LeetCode练题——53. Maximum Subarray

    1.题目 53. Maximum Subarray——Easy Given an integer array nums, find the contiguous subarray (containin ...

  7. redis场景分析的很到位

    链接:http://www.zhihu.com/question/19829601/answer/88069207来源:知乎 1. MySql+Memcached架构的问题 实际MySQL是适合进行海 ...

  8. 喵星之旅-狂奔的兔子-redis使用

    一.命令行使用 redis大概有200多命令,这里只是入门级别,列举了一些非常常见的内容,如果这些会了就可以开启redis进一步学习了. 1.登录数据库 我们需要知道ip地址.端口号.密码(如果有). ...

  9. Ajax请求状态200,却走error的函数

    已经将近一个月没有正式使用Ajax的请求代码了,参加工作后,这是第一次使用,感觉有些生疏,但基本代码还是记得的,写起来也不费劲,但正因为如此,问题就来了,由于经验不足,本来导致问题的原因不是那个,我却 ...

  10. python的matplotlib的热门可视化动图

    1.图 2.代码 import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import matplot ...