2、JVM内存管理

JVM将内存划分为6个部分:PC寄存器(也叫程序计数器)、虚拟机栈、堆、方法区、运行时常量池、本地方法栈

  • PC寄存器(程序计数器):用于记录当前线程运行时的位置,每一个线程都有一个独立的程序计数器,线程的阻塞、恢复、挂起等一系列操作都需要程序计数器的参与,因此必须是线程私有的。

  • java 虚拟机栈:在创建线程时创建的,用来存储栈帧,因此也是线程私有的。java程序中的方法在执行时,会创建一个栈帧,用于存储方法运行时的临时数据和中间结果,包括局部变量表、操作数栈、动态链接、方法出口等信息。这些栈帧就存储在栈中。如果栈深度大于虚拟机允许的最大深度,则抛出StackOverflowError异常。

    • 局部变量表:方法的局部变量列表,在编译时就写入了class文件
    • 操作数栈:int x = 1; 就需要将 1 压入操作数栈,再将 1 赋值给变量x
  • java 堆:java堆被所有线程共享,堆的主要作用就是存储对象。如果堆空间不够,但扩展时又不能申请到足够的内存时,则抛出OutOfMemoryError异常。

    StackOverflowError OutOfMemoryError
    java栈 java堆
    栈深度超过范围了(比如:递归层数太多了) 内存空间不够了(需要及时释放内存)
  • 方法区:方发区被各个线程共享,用于存储静态变量、运行时常量池等信息。

  • 本地方法栈:本地方法栈的主要作用就是支持native方法,比如在java中调用C/C++

3、GC回收机制

  • 哪些内存需要回收?——who
  • 什么时候回收?——when
  • 怎么回收?——how

1、哪些内存需要回收?

  • java堆、方法区的内存
线程私有 线程共享
程序计数器、虚拟机栈、本地方法栈 java堆、方法区
随线程生而生,随线程去而去。线程分配多少内存都是有数的,当线程销毁时,内存就被释放了 堆和方法区的内存都是动态分配的(使用new关键字),所以也需要动态回收。
这部分内存的回收依赖GC完成

2、什么时候回收?

  • 引用计数法
  • 可达性分析

(1)、引用计数法

给对象添加一个引用计数器,每当有一个地方引用它时,计数器加一。反之每当一个引用失效时,计数器减一。当计数器为0时,则表示对象不被引用。

举个例子:

Object a = new Object(); // a的引用计数为1
a = null; // a的引用计数为0,等待GC回收
  • 1
  • 2

但是,引用计数法不能解决对象之间的循环引用,见下例

Object a = new Object(); // a的引用计数为1
Object b = new Object(); // b的引用计数为1 a.next = b; // a的引用计数为2
b.next = a; // b的引用计数为2 a = null; // a的引用计数为1,尽管已经显示地将a赋值为null,但是由于引用计数为1,GC无法回收a
b = null; // b的引用计数为1,同理,GC也不回收b
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(2)、可达性分析

设立若干根对象(GC Root),每个对象都是一个子节点,当一个对象找不到根时,就认为该对象不可达。

没有一条从根到Object4 和 Object5的路径,说明这两个对象到根是不可达的,可以被回收

补充:java中,可以作为GC Roots的对象包括:

  • java虚拟机栈中引用的对象
  • 方法区中静态变量引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中引用的对象

3、怎么回收?

  • 标记——清除算法
  • 复制算法
  • 分代算法

(1)、标记——清除算法

遍历所有的GC Root,分别标记处可达的对象和不可达的对象,然后将不可达的对象回收。

缺点是:效率低、回收得到的空间不连续

(2)、复制算法

将内存分为两块,每次只使用一块。当这一块内存满了,就将还存活的对象复制到另一块上,并且严格按照内存地址排列,然后把已使用的那块内存统一回收。

优点是:能够得到连续的内存空间 
缺点是:浪费了一半内存

(3)、分代算法

在java中,把内存中的对象按生命长短分为:

  • 新生代:活不了多久就go die 了,比如局部变量
  • 老年代:老不死的,活的久但也会go die,比如一些生命周期长的对象
  • 永久代:千年王八万年龟,不死,比如加载的class信息

有一点需要注意:新生代和老年代存储在java虚拟机堆上 ;永久代存储在方法区上

回收方法
新生代 使用复制算法
老年代 使用标记——清除算法
永久代 ————————

补充:java finalize()方法:

在被GC回收前,可以做一些操作,比如释放资源。有点像析构函数,但是一个对象只能调用一次finalize()方法。

JVM内存管理 + GC垃圾回收机制的更多相关文章

  1. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  2. JVM内存管理和垃圾回收机制介绍

    http://backend.blog.163.com/blog/static/20229412620128233285220/     内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...

  3. JVM内存管理及垃圾回收机制

    一.JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示:  二.JVM内存回收 Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对 ...

  4. JVM内存分配与垃圾回收机制管理

    项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...

  5. Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  6. JVM内存管理及垃圾回收【转】

    很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...

  7. JVM架构和GC垃圾回收机制

    深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...

  8. java面试题之----JVM架构和GC垃圾回收机制详解

    JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...

  9. V8 内存管理和垃圾回收机制总结

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...

随机推荐

  1. Spring之Redis访问(Spring-data-redis)

    Spring-data-redis,是spring-data框架中,比较常用的,基于key-value键值对的数据持久层框架.Spring-data-redis,是一个基于Template模板开发的数 ...

  2. 后台程序员简单应用前端的bootstrap(小白)

    原因: 现在技术更新很快,我们需要掌握更多的语言和技术,公司现在也希望招全栈工程师. 名词: bootstrap(前端框架),less(css的扩充) 案例: 在bootstrap中常用row行级元素 ...

  3. Am335x SD卡刷eMMC二

    犹豫前段时间一直在搞另一个项目,Am335x这个BBlack板就放置一边了.前几天把BBlack板重新拿到手,之前搞得给全忘了.SD卡烧写emmC时突然出现了错误,一直找不到原因,今天终于算是有点眉目 ...

  4. linux入门常用指令1.配置本地yum源

    创建光盘挂载点 [root@localhost /]# mkdir /mnt/cdrom 挂载光盘 #挂载光盘 [root@localhost /]# mount /dev/cdrom /mnt/cd ...

  5. java——spring中bean的作用域

    文章:理解Spring框架中Bean的作用域 博客地址:https://baijiahao.baidu.com/s?id=1610298792072480906&wfr=spider& ...

  6. 2018 牛客网暑期ACM多校训练营(第一场) E Removal (DP)

    Removal 链接:https://ac.nowcoder.com/acm/contest/139/E来源:牛客网 题目描述 Bobo has a sequence of integers s1, ...

  7. Python将HTML转换为PDF

    Python将HTML转换为PDF 使用pdfkit库和wkhtmltopdf, pip install pdfkit wkhtmltopdflinux中一般需要添加sudo权限. Windows安装 ...

  8. hdu4612 Warm up[边双连通分量缩点+树的直径]

    给你一个连通图,你可以任意加一条边,最小化桥的数目. 添加一条边,发现在边双内是不会减少桥的.只有在边双与边双之间加边才有效.于是,跑一遍边双并缩点,然后就变成一棵树,这样要加一条非树边,路径上的点( ...

  9. C# 字符串和正则表达式(8) 持续更新

    创建字符串 如果多次修改一个字符串或创建一个很长的字符串,用String类会效率低下.这种情况,可以用 System.Text.StringBuilder ,它专门为这种情况设计的. 格式化表达式 格 ...

  10. redis主从+哨兵 安装配置一

    一.目的 实现redis的高可用. 二.同步过程 注意:当Master在后台把数据保存到快照文件完成之后,Master会把这个快照文件传送给Slave,而Slave则把内存清空后,加载该文件到内存中: ...