Java虚拟机和垃圾回收机制


一、虚拟机及其构成?

1.概念

---虚拟机是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
---Java虚拟机时Java跨平台的重要原因

2.构成

---Java虚拟机主要包括:类加载器、运行时数据区、执行引擎、本地方法接口、本地方法库、垃圾回收器。

Java虚拟机构成
类加载器

负责把class文件装载到内存中,供虚拟机执行。

执行引擎

负责执行字节码

本地方法库

本地方法(native),一个Java的接口,调用非Java代码,其他语言:c、c++等等。

本地方法库接口JNI

允许Java代码使用以其他语言编写的native本地方法库

垃圾回收器

回收无用对象所占用的内存空间

运行时数据区

JVM的核心区域,程序运行时的工作区域,数据加工处理的场所

二、运行时数据区

运行时数据区
程序计数器

程序计数器的作用可以看作时执行字节码的行号指示器,每个线程都有一个独立的程序计数器,独立存储,是线程的私有内存。

Java虚拟机栈(Stack)

该区域存储局部变量表,JVM只对栈帧进行出栈和压栈操作,方法调用时压栈,调用完出栈。

本地方法栈

用于调用本地的方法时使用的栈

Java堆(heap)

堆是垃圾收集管理器管理的主要区域,是被所有线程共享的一块内存区域,用于存放对象实例,几乎所有对象的实例都在这分配内存。

方法区

用于存放已被虚拟机加载的类class信息,常量,静态变量等,实质上也是堆,不同版本的JDK中方法区的实现不同。

三、堆内存

堆内存可以分为三个部分:
	1.年轻代:Young
	2.老年代:Tenured
	3.永久代:PermGen	JDK8中变成了元空间MetaSpace

JDK8之前
JDK8之后
年轻代:分为Eden区+两个大小相同的存活期S0,S1

---new出来的新对象现在Eden区保存,经过几次GC然后依旧存活,晋升到存活区。
---在年轻代使用的是MinorGC,这种GC采用的是复制算法

老年代

---由年轻代发来的对象,一般情况经过(15次)MinorGC存活进入老年代。
---当老年代内存不足时,触发MajorGC,即FullGC
注意:如果保存的对象超过了Eden区的大小,则直接进入老年代

永久代

---实际是指方法区,JDK8以后叫元空间。
---区别:永久代使用的是JVM的堆内存空间,元空间使用的是物理内存,受本机的物理内存限制。
注意:
	  JDK6之前,字符串常量池是放在永久代的方法区
	  JDK7中,字符串常量池从perm区移到正常的Java Heap区域了
	  JDK8中,永久代被元空间替代

四、垃圾回收

分代垃圾回收机制

---1.年轻代
	新对象都放在Eden区,MinorGC采用复制算法,频繁操作,回收生命周期短的对象,当年轻代满后会存放到年老代区域。
---2.年老代
	在年轻代经历了N(默认15)次的垃圾回收仍然存活的对象,会存入年老代,当年老代对象越来越多,就会启动MajorGC和FullGC,全面清理年轻代和年老代区域
---3.永久代
	用于存放静态文件,类,方法等

垃圾回收
注意:

---1.垃圾回收机制主要是回收JVM堆内存里的对象空间
---2.垃圾回收发生具有不可预知性,程序无法精准控制垃圾回收机制进行
---3.程序员可以通过System.gc()或Runtime.getRuntime().gc()来通知系统进行垃圾回收,只是建议,但是系统是否会进行是不确定的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值