JVM垃圾回收

1 概述

      要了解JVM垃圾回收是什么,首先我们应该先认识一下JVM是什么。本篇就来带大家一起揭开JVM神秘面纱。在了解JVM后面我们继续探讨垃圾回收器以及对应的垃圾回收算法。

2 JVM组成

      JVM是Java Virtual Machine(Java虚拟机)的缩写。有时我们也叫它运行时数据区,为方便程序运行和管理细分为多个不同的区域,配合完成java代码的执行。它们用途各异,创建销毁也不同,有的随虚拟机器进程的启动而生,随虚拟机进程的关闭而消亡,有的依赖我们创建的线程开启和结束而建立和消亡。根据《Java虚拟机规范》中规定,jvm所管理的内存大致包括以下几个运行时数据区域。

 

 

2.1 Heap堆

      创建对象的地方,每new一个新对象的时候,都会在堆中开辟一块空间用来存放创建的对象,几乎所有对象都是在这里进行内存分配。它是jvm中最大的一块区域,所有线程共享,也就是说不同线程可以访问同一个对象,这也是我们在多线程访问需要注意的原因。这里也是垃圾回收主战场。如果在创建对象的时候已经达到堆上限会跑出异常OutOfMemoryError,设置堆大小参数 -Xms 虚拟机启动时大小, -Xmx 虚拟机运行过程中最大可分配大小。为了减少动态分配带来的资源消耗生产上一般设置Xms和Xmx一样。

2.2 Method方法区(元空间)

      永久代,和堆一样所有线程共享,主要用于存储已被jvm加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JDK8之前方法区是JVM内存的一部分,从JDK8开始方法区移到了用户内存(堆外内存)中去,JDK8以前叫方法区,JDK8开始叫元空间。方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError: PermGen space(1.8以前)或者java.lang.OutOfMemoryError: Metaspace(1.8及以后)。

方法区大小设置

1.8以前

设置初始值-XX:PermSize=512m

设置最大值-XX:MaxPermSize=512m

1.8及以后

设置初始值-XX:MetaspaceSize=100m

设置最大值-XX:MaxMetaspaceSize=100m(默认值是-1,表示没有限制)

2.3 Stack栈

     栈是存放线程调用方法时存储局部变量表(基本类型的变量数据和对象的引用),操作方法出口等与方法执行相关的信息,Java栈所占内存的大小由Xss来设置。它的特点是区域小,默认只有1M。以帧为单位的压栈或出栈,若不够会抛出StackOverflowError异常。

  1. 每个线程包含一个栈区,栈中只保存基本数据类型的数据和自定义对象的引用(不是对象),对象都存放在堆区中
  2. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  3. 栈分为3个部分:基本数据类型的变量区、执行环境上下文、操作指令区(存放操作指令)。

2.4 Nativemethodstack本地方法栈

Nativemethodstack(本地方法栈):保存native方法进入区域的地址。

2.5 ProgramCounter程序计数器

记录当前正在执行的JVM指令的地址。线程切换恢复到上次执行位置,每个线程一个。这也是唯一一个不会有异常抛出的jvm内存区域。

2.6 DirectByteBuffer直接内存区

以上我们聊的内存都是需要虚拟机管理的内存也叫直接内存。还有一部分非虚拟机管理的用户内存叫堆外内存。从jdk1.4开始nio的引入,为了加速I/O操作性能,DirectByteBuffer是堆外内存分配,不受垃圾回收机制控制,它直接受操作系统管理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值