JVM 从入门到入坟(一)

一、今天我们来聊聊JVM内存,首先什是JVM?

jvm是java虚拟机Java Virtual Machine的缩写。

 

什么是java虚拟机?

虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。简单来说JVM是用来解析和运行Java程序的。
(图文皆取自百度)

java虚拟机的好处?

java可以跨平台运行最主要的原因就是因为有java虚拟机,同时jvm可以屏蔽系统差异发明一些新的语言就可以使用jvm来完成。这样就做到了《一次编译到处运行》的特点。

 2、JVM中内存区域的划分

堆(运行时常量池)new的对象就会放在堆中
方法区加载好的类放在方法区,静态成员
栈(JVM栈和本地方法栈)局部变量
程序计数器

存储的是地址描述的是当前线程接下来

要执行的指令在什么地方

 

 注意:一个进程中存在多个线程,每个线程中都存在自己的栈和程序程序计数器,一个进程中共用一个堆和一个方法区。

判断一个变量是在堆上还是在栈上,和这个变量是基础类型还是引用类型没有关系,和这个变量是局部变量、静态变量还是成员变量有关。

3、常见的面试问题

1)、如何理解局部变量成员变量以及静态变量

成员变量在堆上

局部变量在栈上

静态变量在方法区中

什么是成员变量?什么是静态变量?什么是局部变量?

public class Test01 {
    //成员变量
    Test01 t1=new Test01();
    //静态变量
    static Test01 t2=new Test01();
    public static void main(String[] args) {
        //局部变量
        Test01 t3=new Test01();
    }
}

前面说过(判断一个变量是在堆上还是在栈上,和这个变量是基础类型还是引用类型没有关系,和这个变量是局部变量、静态变量还是成员变量有关。

如上图所说:

 

2)如何理解基础数据类型还是引用数据类型

基础数据类型中对应的内存空间储存的是具体的值

 引用数据类型中对应的内存空间存储的是new对象的地址

3)如何理解引用和对象

引用是指存储的地址,对象是指的new对象的本体

 

 

 

4)static方法和普通方法之间的区别

普通方法中有this(和实例相关),静态方法中没有this(和类相关)普通方法也叫实例方法,静态方法也叫类方法。

二、动态内存管理器(GC)

1、GC的具体作用
GC是垃圾回收机制,java中申请的内存可以被垃圾回收装置进行回收,GC可以一定程度的避免内存泄漏,但是会引入一些额外的开销。

2、GC回收的特点
GC中主要回收的是堆和方法区中的内存,栈中内存的释放要等到线程结束或者是栈帧被销毁,而程序计数器中存储的是地址不需要进行释放。

回收对象的基本单位:

对于GC中回收的基本单位不是字节而是对象

3、回收对象的基本思路:

1)标记:找到这个对象是否需要回收,并且标记出来

2)回收:将这个对象回收回去

4、引用计数法

每个对象都会分配一个专门的计数器变量当有一个新的引用指向这个变量的时候计数器就会加一,当有一个引用不指向这个变量计数器就会减一,当引用计数器为0时就会让这个对象标记回收。

 

但是这有个巨大的问题是:

循环引用问题不能解决:

public class Test01 {
    public static void main(String[] args) {
        Test a=new Test();
        Test b=new Test();
        
        a.t=b;
        b.t=a;
        
        a=null;
        b=null;
    }
}
 
class Test{
    Test t=null;
}

这样计数器一直循环判读不出什么时候为0,需要清除,下章会说说其他几种好的算法。

水平有限,请大家多多指教!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值