月眸


JVM知识总结

毛毛小妖 2019-09-29 48浏览 2条评论
首页/ 正文
分享到: / / / /

首先再来复习一下三大垃圾回收算法,由于引用计数法已经不用了,就不说了。

一、三大垃圾回收算法

1、复制算法

现在的垃圾回收器新生代主要采用复制算法。其原理如下。

1>eden,from区复制到To区,年龄+1

首先,当Eden满的时候会触发第一次GC,把存活的对象拷贝到From区,当Eden区再次触发GC时会扫描Eden区和From区,对这两个区域进行垃圾回收,经过这次回收还存活的对象,直接复制到To区,同时把这些对象的年龄+1.

2>清空Eden和From区

然后,清空Eden和From区中的对象,即:复制之后有交换,谁空谁是To

3>From和To区进行交换

最后,From和To区进行交换。部分对象会在From和To区来回交换,如此交换15次,最终还是存活,则进入老年代。

2、标记清除

分为标记和清除两个阶段。先标记出要回收的对象,然后统一回收这些对象。

3、标记整理

二、相关问题

1、JVM回收垃圾的时候如何确定垃圾?什么是GC Roots?

简单的说内存中已经不再被使用到的空间就是垃圾。一般要确定一个对象是否可以被回收,有两种方式:引用计数法和可达性分析法。引用计数法就是每次创建对象时计数器加1,引用一次加1,不被引用了就减1,计数器为0就代表不在被引用了,但是这种方式解决不了循环引用的问题,所以现在都用的是可达性分析法。

可达性分析法的基本思路是:通过一些列名为“GC Roots”的对象作为起点开始向下搜索,如果一个对象到GC Roots没有任何引用时,就说明此对象不可用,就可以当作垃圾回收了。

Java中可以作为GC Roots的对象有:

    1>虚拟机栈(栈帧中的局部变量区)中引用的对象

    2>本地方法栈JNI(Native方法)中引用的对象

    3>方法区中类静态属性引用的对象

    4>方法区中常量引用的对象

例如:

package com.sy.io;

public class GcRootsDemo {

	//方法区中常量引用的对象
	private Byte[] byteArr = new Byte[100 * 1024 * 1024];
	
	//方法区中静态属性引用的对象
	private static final GcRootsDemo t3 = new GcRootsDemo();
	
	public static void m1(){
		//虚拟机栈中引用的对象
		GcRootsDemo t1 = new GcRootsDemo();
		System.gc();
		System.out.println("第一次GC完成");
	}
	
	public static void main(String[] args){
		m1();
	}
}

2、JVM参数类型

1>标配参数

java -version

java -help

2>X参数(了解)

java -Xint(解释执行)

java -Xcomp(第一次使用就编译成本地代码)

java -Xmixed(混合模式)

3>XX参数

    3.1、Boolean类型

        +表示开启,-表示关闭。

        例如:-XX:+PrintGCDetail

    3.2、KV设值类型

        -XX:属性key=属性值value

        例如:-XX:MetaspaceSize=128M

    3.3、关于-Xms和-Xmx

        -Xms等同于-XX:InitialHeapSize

        -Xmx等同于-XX:MaxHeapSize

        -XSS等同于-XX:ThreadStackSize:设置单个线程栈空间大小

3、盘点家底,查看JVM默认值

使用jps命令查看当前java进程,得到pid之后再用jinfo -flags pid来查看jvm参数配置

3.1、查看初始默认值

java -XX:+PrintFlagsInitial -version

3.2、查看修改更新

java -XX:+PrintFlagsFinal -version

3.3、打印命令行参数

java -XX:+PrintCommandLineFlags

C:\Users\shengyu>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=132628352 -XX:MaxHeapSize=2122053632 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)

4、常用的jvm参数配置

5、如何选择垃圾收集器

1>单CPU或小内存,单机程序

-XX:+UseSerialGC

2>多CPU,需要最大吞吐量,如后台计算型应用

-XX:UseParallelGC

3>多CPU,追求快速响应,如互联网应用

-XX:UseConcMarkSweepGC

最后修改:2019-09-29 11:46:10 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

匿名用户 2019-09-29 23:32:50
大佬,请问你的博客模板哪里找的哈?
回复