javaSE基础——GC、JVM

1 GC垃圾回收

什么是GC?
GC :Garbage Collections 字面意思是垃圾回收器,释放垃圾占用的空间。

对于c、c++的开发人员来说内存是开发人员分配的,也就是说还要对内存进行维护和释放。
对于Java程序员来说,一个对象的内存分配是在虚拟机的自动内存分配机制完成的,不再需要为每一个new操作去写配对的delete/free代码,且不容易出现内存泄露和内存溢出问题。
但是如果出现了内存泄露和内存溢出问题,而开发者又不了解虚拟机是怎么分配内存的话,那么定位错误和排除错误将是一件很困难的事情。

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

(这里大家思考一下,在什么情况下会出现内存泄露和内存溢出问题)

2 JVM内存管理结构

2.1 概念

java Virtual Machinal (java虚拟机)
翻译字节码 (.class文件) 编程机器指令
JRE:java runtime enviroment (java运行环境) jre = jvm +j ava核心类库 + 支持文件
JDK:java development kit (java开发工具) jdk = jre + java工具 + java类库

2.2 JVM运行时数据区

2.2.1 程序计数器(Program Counter Register)

线程私有,运行时才有;
程序计数器是用于存储每个线程下一步将执行的JVM指令(指向当前线程正在执行的字节码地址),如该方法为native的,则程序计数器中不存储任何信息。
在这里插入图片描述

2.2.2 本地方法栈(Native Method Stacks)

JVM采用本地方法栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

2.2.3 虚拟机栈(VM Stack)

JVM栈是线程私有的(运行时才有),每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。

栈特点:FILO先进后出,入栈和出栈在栈顶操作;

栈的数据结构跟java方法调用的执行和结束顺序很吻合;

2.2.3.1 栈帧

(线程私有的),每一个方法要为其分配一个运行空间 每一个方法对应一个栈帧。
存放 局部变量表 ,操作数栈 ,动态链接 ,返回地址
局部变量表:一个32位的地址 一组变量值存储空间 ,用于存放方法参数和方法内部定义的局部变量(this,a,b,c)(有一个指向整调用当前方法的对象 this变量),还有对象的引用。

public int func(){
	int a=100;
	int b=200;
	Dao dao;
	return a+b;
}

操作数栈:方法的执行就对应着栈帧在虚拟机中入栈 出栈的过程
动态链接:(java多态)所以 方法区中用于表示指向对象的实例
返回地址:函数的返回地址

Xss:每个线程的虚拟机栈的大小

异常情况:方法递归溢出 优化策略:栈的大小一般调整小一些。

2.2.4 堆(heap)

线程公有。
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

(1)堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的

(2)Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配

(3)TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

2.2.5 方法区(Method Area)

线程公有。
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。

(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

2.2.6 运行时常量池(Runtime Constant Pool)

存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。JVM在加载类时会为每个class分配一个独立的常量池,但是运行时常量池中的字符串常量池是全局共享的。

2.3 JVM垃圾回收

  • 新生代(堆):Minor GC(复制回收算法)
    只在 T F中进行复制回收算法,速度快,但是浪费空间
    (90%的对象不用去垃圾回收,但需要10%的空间去做一个预留区 ,所以 Eden:From Survivor 空间:To Survivor空间=8:1:1)
  • 老年代(堆): Full GC
    标记清除,标记整理算法。
    优先使用标记清除,如果碎片过多,就会标记整理算法,整理碎片。
  • 永久代(方法区):永久代里面会发生垃圾回收,

1.垃圾回收算法:
2.复制回收Copying算法:
把内存分成等分的两份(预留区),使用率只有50%,因为要预留。
3.标记清除算法:
回带来内存碎片问题
4.标记整理算法:
存储空间可能不连续,碎片,所以要把空闲的都归到一起

JVM垃圾回收知识点 参考这个童鞋的昂~
https://blog.csdn.net/weixin_42505605

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值