JVM内存管理 + GC垃圾回收机制
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垃圾回收机制的更多相关文章
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
- JVM内存管理和垃圾回收机制介绍
http://backend.blog.163.com/blog/static/20229412620128233285220/ 内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...
- JVM内存管理及垃圾回收机制
一.JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 二.JVM内存回收 Sun的JVMGenerationalCollecting(垃圾回收)原理是这样的:把对 ...
- JVM内存分配与垃圾回收机制管理
项目上线,性能优化有个重要组成就是jvm内存分配和垃圾回收机制的管理配置. 网上随便能搜到相关的具体步骤,以及内存中各种参数对应的意义,不再赘述. 干货就是直接抛出遇到的问题,以及如何解决的,再说说待 ...
- Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM内存管理及垃圾回收【转】
很多Java面试的时候,都会问到有关Java垃圾回收的问题,提到垃圾回收肯定要涉及到JVM内存管理机制,Java语言的执行效率一直被C.C++程序员所嘲笑,其实,事实就是这样,Java在执行效率方面确 ...
- JVM架构和GC垃圾回收机制
深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...
- java面试题之----JVM架构和GC垃圾回收机制详解
JVM架构和GC垃圾回收机制详解 jvm,jre,jdk三者之间的关系 JRE (Java Run Environment):JRE包含了java底层的类库,该类库是由c/c++编写实现的 JDK ( ...
- V8 内存管理和垃圾回收机制总结
这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...
随机推荐
- WinPE基础知识之重定位表
typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; // (重要)需要重定位的位置,这是一个RVA DWORD SizeOfBl ...
- 6.移动端自动化测试-小知识 if __name__==’__main__:是什么意思?
1 引言 在Python当中,如果代码写得规范一些,通常会写上一句“if __name__==’__main__:”作为程序的入口,但似乎没有这么一句代码,程序也能正常运行.这句代码多余吗?原理又在哪 ...
- VirtualBox使用
热键:Right Ctrl 串口 端口编号: COM1 -> /dev/ttyS0 COM2 -> /dev/ttyS1 COM3 -> /dev/ttyS2 COM4 -> ...
- 6.SpringMVC 配置式开发-处理器
处理器除了实现Controller 接口外,还可以继承自一些其他的类,来完成一些特殊的功能 1.继承自AbstractController类 若处理器继承自AbstractController类,那么 ...
- Java检查异常和非检查异常,运行时异常和非运行时异常的区别
通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions).其中根据Exception异常 ...
- 用例图,ER图,架构图
用例图 ER图 架构图 注:附上小组画图文档链接 提取码:t7ij v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VM ...
- Ubuntu系统---FeiQ安装记录
Ubuntu系统---FeiQ安装记录 linux下安装飞秋/飞鸽传书之类的软件iptux信使,可以与windows在一个局域网下聊天与传书文件,安装很简单. 首先,直接运行下面的语句即可:sudo ...
- sklearn & ml tutorial
第一章 引言 pd.scatter_matrix(pd.DataFrame(X_train),c=y_train_name,figsize=(15,15),marker='o',hist_kwds={ ...
- C++-cin与scanf cout与printf效率问题
http://blog.csdn.net/l2580258/article/details/51319387 void cin_read_nosync() { freopen("data.t ...
- Python&Selenium 数据驱动【unittest+ddt+json】
一.摘要 本博文将介绍Python和Selenium做自动化测试的时候,基于unittest框架,借助ddt模块使用json文件作为数据文件作为测试输入,最后生成html测试报告 二.json文件 [ ...