【第8章】JVM内存管理

原创
2016/09/02 17:51
阅读数 328
1.物理内存和虚拟内存

1.1.物理内存指的是RAM(随机存储器)

1.2.寄存器也是一个存储单元,用来存储计算单元执行指令的中间结果

1.3.地址总线是用来连接处理器和RAM或者连接处理器和寄存器的

1.4.访问内存的方式:大多数情况下,调用操作系统提供的接口

1.5.操作系统管理内存的申请空间是按照进程来管理的(互相不会访问)

1.6.虚拟内存是在随着程序越来越多和设计的多任务性,物理内存无法满足程序需求的情况下出现的

1.7.虚拟内存的出现使得多个进程之间可以共享物理内存.共享指的是空间上的共享,逻辑上还是不能够互相访问

2.内核空间与用户空间

2.1.地址空间划分为内核空间(操作系统的空间)和用户空间(程序调用者的空间),内存的使用形式

2.2.内核空间主要是指操作系统运行时所使用的用于程序调度、虚拟内存的使用或者连接硬件资源等的程序逻辑

2.3.网络传输的数据先是从内核空间收到远程主机的数据,然后再将内核空间的数据复制到用户空间

3.在Java中哪些组件需要使用内存

3.1.Java堆:用于存储Java对象的内存区域,堆的大小在JVM启动时就一次向操作系统申请完成,就此大小固定

3.2.线程:每个线程创建时JVM都会为它创建一个堆栈

3.3.类和类加载器:JVM只会加载程序中用到的类,木有用到的类是不会调用的

3.4.类被卸载的条件

3.4.1.在Java堆中没有对表示该类加载器的java.lang.ClassLoader对象的引用

3.4.2.Java堆没有对表示类加载加载的类的任何java.lang.Class对象的引用

3.4.3.在Java堆中该类加载器加载的任何类的所有对象都不再存活

3.5.任何系统类或通过应用程序类加载器加载的任何应用程序类都不能在运行时释放

3.6.I/0(NIO)分配的内存是本地内存而不是Java堆上的内存,避免了在Java堆与本机堆之间复制数据

3.7.JNI

4.JVM内存结构

4.1.JVM是按照运行时数据的存储结构来划分内存结构的

4.2.在Java虚拟机规范中将Java运行时数据划分为6种

4.2.1.PC寄存器数据:保存当前正常执行的程序的内存地址,记录下哪个线程当前执行到哪条指令

4.2.2.Java栈:每创建一个线程就会有一个对应的栈,每调用线程中的一个方法,就会有一个对应的栈帧(POP出栈帧的元素作为方法的返回值)

4.2.3.堆:存储Java对象的地方,被所有Java线程所共享

4.2.4.方法区:存储类结构信息的地方,属于Java堆中的永久区,被所有Java线程所共享

4.2.5.本地方法区

4.2.6.运行时常量池:属于方法区的一部分

4.2.7.本地方法栈:为JVM运行Native方法准备的空间,俗称C栈

5.JVM内存分配策略

5.1.静态内存分配:在程序编译时就能确定每个数据在运行时所需要的空间大小,所以在编译时就可以给它们分配固定的内存地址,例如:static String n

5.2.栈内存分配(动态内存分配):由一个类似于堆栈的运行栈来实现的,运行时才知道数据所需内存空间大小.但是规定在进入程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存

5.3.堆内存分配:当程序真正运行到相应代码时才会知道空间大小

5.4.栈中主要存放一些基本类型的变量数据,存取速度比堆要快,仅次于寄存器.缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

5.5.每个Java应用都唯一对应一个JVM实例,每个实例唯一对应一个堆

5.6.所有对象的存储空间都是在堆中分配的,对象的引用是在堆栈中分配的

5.7.堆的优势是可以动态地分配大小,缺点是在运行时分配内存,存取速度较慢

5.8.new对象的时候,并不会直接将对象的引用给本地变量,而是调用这个类的构造方法初始化这个类,将复制一份后,再赋值给本地变量

5.9.堆用来存放对象,栈用来存放执行程序

5.10.动态分配内存前,需要确定内存大小(在编译时完成)

6.JVM内存回收策略

6.1.显示的内存申请有两种:静态内存分配,动态内存分配

6.2.如何检测垃圾

6.2.1.正确地检测出垃圾对象

6.2.2.能够释放垃圾对象占用的内存空间

6.3.活动对象指的是能够被一个根对象集合到达的对象,非活动对象可以被垃圾收集器回收

6.4.基于分代的垃圾收集算法:对象按照寿命长短来分组,分为年轻代和年老代

6.5.垃圾收集算法

6.5.1.Serial Collector(单线程)

6.5.2.Parallel Collector(多线程)

6.5.3.CMS Collector

Remark:

1.在Java中,分配内存和内存回收都是由JVM自动完成的

 

展开阅读全文
打赏
0
5 收藏
分享
加载中
每日打卡
2021/03/03 11:27
回复
举报
更多评论
打赏
1 评论
5 收藏
0
分享
返回顶部
顶部