JVM学习

jvm学习

一、jvm简介

jdk、jre、jvm关系图
在这里插入图片描述

java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。
在这里插入图片描述

类装载器(ClassLoader)(用来装载.class文件)
执行引擎:执行字节码或者本地方法。
运行时数据区:方法区,java堆,java栈,本地方法栈,寄存器。

1.jvm运行时数据区

在这里插入图片描述
第一块:方法区域(Method Area)

(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

第二块:堆(Heap)

它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。>
(1) 堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的
(2) Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配
(3) TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。
(4) 所有新创建的Object 都将会存储在新生代Yong Generation中。如果Young Generation的数据在一次或多次GC后存活下来,那么将被转移到OldGeneration。新的Object总是创建在Eden Space。

第三块:JVM栈

JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。*

第四块:本地方法堆栈(Native Method Stacks)

JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

第五块:PC寄存器

PC寄存器是用于存储每个线程下一步将执行的JVM指令,如 该方法为native的,则PC寄存器中不存储任何信息。

第六块:运行时常量池(Runtime Constant Pool)

存放的为类中的固定的常量信息、方法和Field的引用信息等,其空间从方法区域中分配。

二.jvm垃圾回收

1.有两种算法可以判定对象是否存活:

1.)引用计数算法:给对象中添加一个引用计数器,每当一个地方应用了对象,计数器加1;当引用失效,计数器减1;当计数器为0表示该对象已死、可回收。但是它很难解决两个对象之间相互循环引用的情况。
2.)可达性分析算法:通过一系列称为“GC Roots”的对象作为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即对象到GC Roots不可达),则证明此对象已死、可回收。Java中可以作为GC Roots的对象包括:虚拟机栈中引用的对象、本地方法栈中Native方法引用的对象、方法区静态属性引用的对象、方法区常量引用的对象
在主流的商用程序语言(如我们的Java)的主流实现中,都是通过可达性分析算法来判定对象是否存活的。
在这里插入图片描述

2.JVM垃圾回收介绍

GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

(1)对新生代的对象的收集称为minor GC;

(2)对旧生代的对象的收集称为Full GC;

(3)程序中主动调用System.gc()强制执行的GC为Full GC。

不同的对象引用类型, GC会采用不同的方法进行回收,JVM对象的引用分为了四种类型:

(1)强引用:默认情况下,对象采用的均为强引用(这个对象的实例没有其他对象引用,GC时才会被回收)

(2)软引用:软引用是Java中提供的一种比较适合于缓存场景的应用(只有在内存不够用的情况下才会被GC)

(3)弱引用:在GC时一定会被GC回收

(4)虚引用:由于虚引用只是用来得知对象是否被GC

3:垃圾收集算法

1、标记-清除算法
2、复制算法
3、标记-整理算法
4、分代收集算法

4:垃圾收集器

1.Serial收集器
2.ParNew收集器
3.Parallel Scavenge收集器
4.Serial Old收集器
5.Parallel Old收集器
6.CMS收集器
7.G1收集器
在这里插入图片描述

在这里插入图片描述

回收器配置

在这里插入图片描述

一、-XX:+UseSerialGc :新生代用串行,老年代也默认用串行回收

在这里插入图片描述

二、-XX:+UseParNewGC :新生代用并行,老年代还是串行

在这里插入图片描述

三、-XX:+UseParallelGC :新生代用并行,老年代也是并行(jdk默认)

在这里插入图片描述

四、-XX:+UseParallelOldGC :新生代用并行,老年代也是并行,和3互相激活
五、-XX:+UseConcMarkSweepGc (CMS并发标记清除,新生代默认用并发,老年代用CMS)

在这里插入图片描述在这里插入图片描述

六、-XX:+UseSerialOldGC :基本上不用了,搬到CMS保底回收

在这里插入图片描述

七、-XX:+UseG1GC (G1回收器)

1.G1和CMS比较,和CMS相似有4步过程,但是没有内存碎片。
2.可以精确控制swt停顿时间,收集器把整个堆(新生代,老年代)划分成多个大小固定的区域,每次回收允许限定控制的时间去回收垃圾最多的空间。
特点:
在这里插入图片描述

在这里插入图片描述G1常用参数配置
在这里插入图片描述

如何选择收集器

在这里插入图片描述

java8 常用垃圾回收算法

在这里插入图片描述

1.Serial 串行回收( -XX:+UseSerialGC)
它为单线程环境设计并且只使用一个线程进行垃圾回收,会暂停所有的用户线程。所以不适合服务器环境。
回收常用算法:新生代:复制
				  老年代:标记压缩
2.Parallel 并行回收 (jdk8默认: -XX:+UseParallelGC)
多个垃圾回收线程并行工作,此时用户线程是暂停的,适用于科学计算/大数据处理等弱交互场景。
回收常用算法:新生代:复制
				  老年代:标记压缩
3.CMS 并发标记回收
用户线程和垃圾收集线程同时执行(不一定是并行,可能交替执行),不需要停顿用户线程互联网公司多用它,适用于对响应时间有要求的场景。
分多个阶段:初始标记,并发标记,重新标记,并发清除等。初始和重新标记都要暂停Mutator,两个并发标记和清除可以和Mutator一起运行。
适用于老年代回收,新生代一般用并行回收
4.G1 垃圾优先回收
G1垃圾回收器将堆内存分割成不同的区域然后并发的对其进行垃圾回收

最后献上jvm结构图
在这里插入图片描述

三.垃圾回收1.8后总结

0.新旧比对

1.1.7和1.8的区别,oracle收购sun之后,元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。

2.PermGen空间被移除了,取而代之的是Metaspace

需要做的调整为-XX:PermSize=64m -XX:MaxPermSize=128m 变成 -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m 否则起不来

3.CompressedClassSpaceSize = 1073741824 (1024.0MB) 多出了这块,

CompressedClassSpaceSize的调优只有当-XX:+UseCompressedClassPointers开启了才有效-XX:CompressedClassSpaceSize=1G
由于这个大小在启动的时候就固定了的,因此最好设置得大点。没有使用到的话不要进行设置JVM后续可能会让这个区可以动态的增长。不需要是连续的区域,只要从基地址可达就行;可能会将更多的类元信息放回到元空间中;未来会基于PredictedLoadedClassCount的值来自动的设置该空间的大小 。
在这里插入图片描述

1.引用计数(无法解决循环引用问题,一般不用了)

在这里插入图片描述

2.复制(无碎片空间,但占用内存比较多–用于新生代

在这里插入图片描述

</

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值