JAVA学习之路--与JVM的亲密接触

tip:从事开发也大半年,每天代码代码,是时候停下来看看jvm里面的知识面与运行原理,据说有利于开发。

流程:知识面网络图-->对一些认为较为浅的知识点进行解释,无太过与深入的研究。




JVM内存模型线程私有区域:线程私有数据区域的生命周期与线程相同,依赖用户线程的启动和销毁,也就是说它的生命随着用户的销毁而结束。

1、 程序计数寄存器(program counterregister):一块较小的内存空间,作用时计数当前线程锁执行字节码的行号。在JVM模型中,字节码解释器就是通过改变PC值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能,仅限于Java方法,Native方法该计数器值为undefined。JVM中的并发是通过线程切换并分配时间片执行来实现的. 在任何一个时刻, 一个处理器内核只会执行一条线程中的指令. 因此, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要有一个独立的程序计数器, 这类内存被称为“线程私有”内存

2、 Java Stack(虚拟机栈):虚拟机栈描述的时Java方法执行的内存模型,每个方法执行的时候都会创建一个栈帧(stack frame)用于存储局部变量、操作数栈、动态链接、方法出口等信息,一个方法的开始到结束或者到返回信息就对应着一个栈帧的在虚拟机栈中从入栈到出栈的过程。

3、 本地方法栈(native method stack):本地方法栈在作用,运行机制,异常类型等方面都与虚拟机栈相同,唯一得区别是,虚拟机栈是执行java方法得,而本地方法栈是用来执行native方法得,但在hotSpot中会将本地方法栈与虚拟机栈放在一起使用。

线程共享区域:随虚拟机的启动而创建,关闭而销毁。

1、 堆(heap):堆区是Java GC机制最重要得区域,没有之一。在JVM所管理的内存中,堆区是最大的一块,堆区也是Java GC机制所管理的主要内存区域,堆区由所有线程共享,在虚拟机启动时创建堆区的存在时为了存储对象实例、数组等,原则上讲,所有的对象都在堆区上分配内存。细分的讲,从内存分配的角度来看,线程共享的Java堆还可以划分出多个线程私有的分配缓冲区(TLAB)而进一步划分的目的时为了更好的回收内存和更快的分配内存

2、 方法区(Method Area):用于存储被JVM加载的类信息、常量、静态变量、即时编译器后的代码等数据。在Java虚拟机规范中,将方法作为堆的一个逻辑部分来对待,但事实上,方法区并不是堆,另外Java GC的分代收集的思想扩展到了方法区,并将方法区设计成了永久代,不过,除HostPost之外的多数虚拟机,并不将方法区当做永久代,HotSpot本身,也计划取消永久代。

GC:gc垃圾回收器,分为两类普通GC(minorGC)和全GC(fullGC)。他们的区别很大,minorGC是对于新创建的对象进行垃圾回收即从年轻代包括eden和survival区进行GC,进行minorGC的时候不会影响老年代。而fullGC是对年轻代与老年代GC,老年代一般存储的是生命周期长的对象,所以fullGC耗时长,也是我们调优的重点,减少fullGC的次数,如果fullGC暂停程序时间长,会很影响系统的性能。

classLoader:类加载子系统,用来加载系统的类、接口。classLoader也称类加载器,一般开发者用的不多,但是对于框架开发者非常常见。理解classLoader的加载机制,也有利于我们编写出更高效的代码,classLoadr的具体作用就是将class类文件加载到JVM虚拟机中区,程序就可以正常运行。但是,JVM启动的时候并不会一次性加载所有的class类文件,而是根据需要去动态加载。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值