jvm 基础知识点速记

1 什么是java虚拟机?为什么java被称为 与平台无关的语言
java虚拟机是一个可以执行java字节码文件的虚拟机进程,java源文件被称为java虚拟机的执行的字节码文件。java被设计成允许应用程序执行的字节码文件,这不需要程序员为每个平台做单独的重写或者重新编译。

2 java 内存模型:

  • java堆:Java虚拟机内存管理的最大的一块 ,java堆是所有线程共享的一块内存区域
    ,在虚拟机启动时创建,此内存区域唯一的目的就是存放对象实例,几乎所有对象的实例都在这里分配内存。
  • 方法区:方法区和java堆一样是各个线程共享的内存区域,它用于存储被虚拟机所加载的 类信息、常量、静态变量、即时编译器变异后的代码等数据。
  • 程序计数器:是一块较小的内存空间,他的作用是存储当前线程所执行的字节码的行号的指示器。
  • jvm栈:和程序计数器一样 栈也是线程私有的,他的声明周期与线程相同,虚拟机栈描述的是java方法执行的内存模型,每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表,操作栈,动态链接,方法出口等信息,每个方法被调用直至执行完成的过程,就对应着一个虚拟机栈中从入栈到出栈的过程。
  • 本地方法栈:本地方法栈和虚拟机栈发挥的作用非常相似,区别在于虚拟机栈是虚拟机执行java方法也就是字节码服务,而本地方法栈是为虚拟机只用到Native方法服务。

3.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
String str = new String(“hello”);
变量str在栈上 str的字符串对象在堆上 字面内容‘hello”’ 在方法区

4.对象分配规则

  • 对象优先分配到Eden区,如果Eden区没有足够的空间时,虚拟机执行一次MinorGC。
  • 大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)这样做的目的是避免了在Eden区和两个Survivor区之间的发生大量的内存拷贝(新生代采用复制算法收集内存)。
  • 长期存活的对象进入老年代。虚拟机为每个对象定义了一个年龄计数器,如果对象经过了一次MinorGC那么对象会进入Survivor区,之后没经历一次minorGC那个对象的年龄加一,直到达到阈值(16)对象进去老年区
  • 动态判断对象的年龄。如果survivior区中相同年龄所有对象的大小的总和大于survivor区的一半,年龄大于或者等于该年龄的对象可以直接进入老年代。
  • 空间分配担保。每次进行MinorGC时,jvm会计算Survivor区移至老年区的对象的平均大小,如果这个值大于老年区的剩余值大小则进行一次fullGC如果小于就检查 HandlePromotion设置,如果true 则只进行MonirGC,如果false则进行Full GC。

5.java对象的定位方式
句柄池,直接指针
6判断一个对象应该被回收
1.该对象没有与GC Roots相连
2.该对象没有重新finalize()方法或者finalize()已经被执行过则直接回收(第一次标记),否则将对象假如F-Queue队列中 优先级很低的队列 在这里执行finalize()方法之后进行第二次标记 如果仍然被标记 则GC执行 否则移出队列

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

默海情深以往

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值