从入门到到放弃之初探jvm(一)

从菜鸟到大神的阶段不可缺少的知识就是jvm了,今天带大家走进别人眼中的"了解jvm",带你如何成为大佬,当然大佬也不是扯蛋就可以了。话不多说,直接进入正题;

1、概述

Java是一个自动管理内存的语言,自动回收垃圾,不要程序猿自己手动释放内存,但是一但出现虚拟机层面的错误的时候,比如内存溢出和泄露的时候,那我们是不是束手无策了呢?如果不了解jvm的话,肯定很吃亏,那排查错误是一项艰巨的任务。下面分享一下虚拟机的内存区域。

2、jvm运行时数据区

 

2.1 程序计数器

程序计数器是一块较小的空间,它的作用时当前线程所执行的字节码的行号指示灯。字节码解析器工作时是通过改变计数器的值来选取下一条需要执行的字节码指令、分支、循环、异常处理,这些都需要程序计数器来完成,由于多线程之间的切换,线程A处理指令到XXA,这时线程A放弃cpu资源,切换倒难线程B,B执行指令XXB,这时线程B生命周期完成,线程A继续执行,这个时候,计数器就发挥作用了,它会记住线程A执行到那哥执行,又接着会往下一条指令去执行。它是一块线程私有的空间

2.2 java虚拟机栈

与程序计数器一样,虚拟机栈时线程私有的。经常听到有人把虚拟机分为堆和栈,这两块是我们比较关心的,实际上要比这复杂,栈就是Java虚拟机栈,或者是虚拟机中的局部变量表,局部变量表中存放了编译 期间的各种基本类型(int,byte,char,long,boolean,float,double,short)和引用类型,它不等同于对象本身,它可能是指向一个地址,也可能是一个对象的句柄。举个列子:

Student stu=new Student();

定义了一个学生对象来接收一个学生的实例对象,这里其实又两个个步骤,先定义Student stu对象,再new一个实例对象

在堆里,实际上存的是对象的地址XXX090,而stu这个对象指向XXX090这个地址。

这个Java虚拟机规范中,定义了两种异常状况

如果线程请求的栈的深度大于虚拟机栈的深度,就会抛出StackoverfloweError异常。如果虚拟机可以动态扩展,当扩展时,无法申请到足够的内存,将会抛出,OutofmemoryError异常。

2.3 本地方法栈

本地方法栈和虚拟机栈发挥的作用是非常相似的,区别不过,虚拟机栈执行java方法,本地方法栈则是为虚拟机用的方法服务。有些虚拟机(Hotspot虚拟机)直接把本地方法栈和虚拟机栈合二为一,也会抛出StackoverfloweError和OutofmemoryError异常

2.4 Java堆

java堆是一块很大的内存空间,Java堆是被所有线程共享的一块空间,此空间最多就是存放实例对象。

Java堆也是GC的重要区域,堆中又分为老年代和新生代

 

新生代又分为eden和s0和s1它们之间的比例是8:1:1,新生代的对象很快就会被回收,而老年代大的对象就是不容易被回收。

堆中的内存可以通过参数配置,(Xms和Xmx)最小和最大堆内存,有时候又将Xms和Xmx设置一样大,可以防止动态扩展的时候要频繁的设置堆内存的大小。

 

2.5本地方法区

本地方法区和Java堆内存一样也是线程共享区域吗,用于存放被虚拟机加载的类信息,常量,静态变量,有时候方法区被称为永久代,但是jdk8这个区域变成了元空间。这个区域很少垃圾回收

 

总结:

java虚拟机内存可分为五大块 :程序计数器,Java虚拟机栈,本地方法栈,Java堆,本地方法区。我们经常关系的区域是Java虚拟机栈和Java堆。Java堆是分配实例空间的地方,也是垃圾回收的重要区域。虚拟机栈的方法区市存放八种基本类型和引用类型的空间。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值