JVM内存管理

1 物理内存和虚拟内存

通常在操作系统下,内存的管理是按照进程来管理的,每个进程会有独特的地址,独立的地址空间。这里的独立指的是逻辑上的相互独立。虚拟内存的出现让多个线程共享物理内存,但是还是在逻辑上保证不能相互访问;

2 内核空间和用户空间
内核空间是操作系统用来程序调度,连接硬件资源等所使用的内存;程序能申请的只能是用户空间的内存;
3 JVM的内存结构
Java启动后也作为一个进程在操作系统中运行;为如下部分分配内存空间:
①Java堆(Java Heap)唯一的目的是用来存放对象实例,一旦申请,堆的大小就固定了,不能重新申请;Java堆内存空间的管理由JVM来控制,对象创建由程序控制,对象空间的释放由垃圾收集器(GC)完成。并且堆是被所有JAVA线程所共享的,所以比较关心它的同步问题;会抛出OutOfMemroryError异常

②Java虚拟机栈:JVM每创建一个线程,就会产生一个对应的栈,这个栈李有很多栈帧(Frames)对应每个方法,里面放着局部变量,操作栈和返回值等信息,其中各种基本数据类型和对象引用;因为是和Java线程对应起来的,是线程私有的,这个数据不是线程共享的。会抛出OutOfMemroryError异常和StackOverflowError异常。

③本地方法栈:和第二点Java虚拟机栈,作用类似,不过是位Native方法准备的空间。很多Native方法是用C写的,通常又叫C栈,会抛出OutOfMemroryError异常和StackOverflowError异常。

④方法区:和Java堆一样,是各个线程共享的内存区域,已经被加载的类信息,常量池,静态变量,构造函数等都储存在这个区域;虽然在Java虚拟机中把他称为Java堆的一部分--Java堆中的永久区,但有一个名字Non-heap,是要和堆区分来的。其中运行时常量池(Running Constant Pool)是方法区的一部分

⑤PC寄存器/程序计数器(Program Counter Register):是一块很小的内存空间;因为JAVA是多线程的,需要记录当前线程的指针信息,对于native方法,就不要求记录,计数器值为空;此区域是唯一一个没有规定会抛出OutOfMemroryError异常

⑥直接内存:并不是虚拟机运行时数据区的一部分也不是JAVA虚拟机规范定义的内存区域。但是被频繁使用,也会引起会抛出OutOfMemroryError异常。主要是新的I/O类库,分配的内存使用的是本机内存而不是Java堆上的内存;

4.JVM内存分配策略
操作系统通常把内存分配分为三种:
①静态内存分配:程序编译时就能知道每个数据的储存空间需求;不允许可变数据结构和嵌套,递归的存在,因为无法计算空间需求;
②栈内存分配:在程序入口的时候必须知道储存大小,为其分配;
③堆内存分配:在程序运行的时候才知道,为其分配;
Java主要是堆栈内存分配;


5.JVM内存回收策略
①静态内存分配和回收:对象的引用占4个字节,当方法结束,对应的栈帧撤销,也就没有回收了静态内存空间。方法或者线程结束后,内存自然就跟着回收了;
②动态内存分配和回收:重点关注java堆和方法区:因为只有在程序运行的时候,才知道对象的内存分配大小。当对象死了(不再引用了)Gc就会根据收集算法 回收死亡的对象。

6.如何检测垃圾
GC:所完成的两件事,a.正确检测出垃圾对象,b.正确释放垃圾对象的空间;
a.①引用计数法:引用一个,计数+1,为0就回收
   ②可达性分析,如果对象不可达,像图一样,就回收
b.基于分代的垃圾收集算法:把对象按照寿命长短来区分;分为young,old,Perm区;
   其中young又分为Eden,两个Survivor区,新创建的在Eden区,Eden满了后又会触发minorGC将Eden还存活的对象,和另外一个Survivor-from对象复制到Survivor-to区;保证有一个Survivor区是空的;
   young区的Survivor也满了的话,minor GC会把多的对象和Survivor中足够老的对象都复制到Old区;Old也满了的话会触发Full GC,回收整个堆内存;
   Perm区是存放类的class对象,如果频繁的被加载,也是会被Full gc触发垃圾回收的;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

obession

觉得有用可以打赏咖啡一杯~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值