Java基础知识每日总结(一)

今天咱们主要来谈一谈jvm:

首先,先说一下jvm是什么:Java Virtual Machine,Java虚拟机,Java程序的跨平台特性是第一版Java推出的时候主打的口号write once ,run everywhere。Java虚拟机中的Java解释器可以把字节码文件解释成特定的机器码进行运行,Java源程序需要通过编译器编译成为.class文件,jvm是jre的一部分,可以把它当做一个仿真的计算机来看。

jvm的内存区域划分:

它主要分为类加载器子系统,运行时数据区,执行引擎。

类加载器子系统:

每一个Java虚拟机都有一个类加载系统,负责加载程序中的类和接口,并赋予一个唯一的名字,jvm有两种类装载器,一种是启动类装载器,另一种是用户自定义类装载器,启动类装载器是jvm的一部分,而用户自定义类装载器就是Java程序的一部分必须是ClassLoader的子类。

执行引擎:

执行引擎要不在执行字节码,要不在执行本地方法,

即时编译器:在执行起来更快,但是也跟消耗内存,在这种情况下,第一次执行的字节码,会编译成本地机器代码,编译出的本地机器代码会被缓存,当方法以后调用的时候可以重用

自适应优化器:在这种方法里,虚拟机开始的时候解释字节码,但是会一直监视程序的活动,只把活动最频繁的编译成本地代码,其他的由于使用的不太频繁,还是保存为字节码。

运行时数据区:

运行时数据区主要包括:方法区,程序计数器,堆区,虚拟机栈,本地方法栈

1.程序计数器:他是线程私有的,每一个线程都有一个程序计数器,用来记录当前线程执行的字节码的行号,由于Java的多线程机制,在来回切换线程并且分配执行时间,为了在线程切换之后还可以准确的找到上一次这个线程执行的字节码的位置,所以才需要这个程序计数器。

2.虚拟机栈:描述的是Java内存模型,方法的执行过程就是一个压栈和出栈的过程,如果在一个方法里A里又调用了方法B,在执行的时候A会先被压入栈,B在A之后入栈,出栈的时候B先出栈,然后A才出栈,每一个方法在执行的时候会创建一个栈帧,栈帧里面存放了局部变量表,操作数栈,动态链表,方法出口等信息,栈帧会随着方法调用到完成,在虚拟机栈里面完成入栈和出栈的过程。 在虚拟机栈中,如果线程申请的深度超出了虚拟机栈的深度,抛出StackOverflowError;如果虚拟机栈是可扩展的,而扩展的时候没有足够的内存,抛出OutOfMemoryError(简称OOM)。

3.本地方法栈:主要是为了调用本地方法,和虚拟机栈大概相同,本地方法栈也有可能报出虚拟机栈所抛出的异常;

4.堆:是所有的线程共享的一块内存区,也是GC管理的主要区域,在以后的文章中会为大家详细介绍GC,堆主要存放对象实例,基本上所有的对象实例和数组都在堆区,堆区可以通过-Xmx和 -Xms来设置堆区的大小

       -Xmx20m: 设置JVM允许分配的最大堆内存20m 
  -Xms20m: 设置JVM分配的初始堆内存20m 

如果堆区中没有足够的空间来存放对象实例,并且也不能扩展的话会抛出OutOfMemoryError错误。

5.方法区:方法区主要存放被虚拟机加载的类信息,常量,静态变量和即时编译器编译后的代码,方法区是线程安全的,所以方法区中数据的访问必须要是线程安全的,方法区的大小不是固定的,可以动态调整,并且方法区也可以被GC。

 

 

 

新手总结,欢迎指正,补充

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值