JVM

本文是个人学习总结,每个问题回答不是很全,只是作为一个思路,读者可根据这些常问题目、思路再去补全自己的知识。

java中什么是垃圾?什么是GC Roots
简单来说就是内存中不再被使用的对象。通过一系列被称为"GC Root"的对象作为起始点,从这些节点向下搜索,
搜索走过的路径就叫引用链,当一个对象到GC root没有任何引用链就是不可达,就是垃圾。
可以作为GC root对象的:
1.栈中引用的对象
2.方法区中类静态属性引用的变量
3.方法区中常量引用的对象
4.本地方法栈中JNI引用的对象。
请问如何盘点查看JVM系统默认值
有三类参数:
1.标配参数如-version -help等。
2.X参数比如-Xlint,-Xcomp,-Xmixed
3.XX参数:Boolean类型;KV类型;jinfo -flag 具体参数 java进程编号
java -XX:+PrintFlagsInitial  HelloWorld 查看JVM初始的参数,相当于默认值
java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m HelloWorld 查看修改后的JVM的参数
java -XX:+PrintCommandLineFlags -version查看JVM的使用值(用户修改过的)
":="代表被修改过,"="初始的,没被修改过的
你常用的JVM配置参数
-Xms,初始大小内存,默认为物理内存1/64,等价于-XX:InitialHeapSize
-Xmx,最大内存,默认为物理内存1/4,等价于-XX:MaxHeapSize
-Xss,设置单个线程栈的大小,一般是512Kb-1024Kb之间,等价于-XX:ThreadStackSize
-Xmn 设置年轻代大小
-XX:MetaspaceSize设置元空间的大小
-XX:+PrintGCDetails
-XX:SurvivorRatio=8 年轻代 Eden区和suvivor单区的比例
-XX:NewRatio=2 新生代与老年代在堆结构的占比
-XX:MaxtTenuringThreshold 对象躲过多少次回收可以进入老年代

谈谈软引用、强引用、弱引用、虚引用分别是什么
强引用:默认的引用,如何都不会被回收。
软引用:SoftReference类,当内存不够用时,会回收它指向的对象。
弱引用:WeakReference类,不管内存够不够,一旦发生GC,都会被回收
上面两种引用的应用场景:缓存,当内存不足时,就会回收一些缓存
WeakHashMap 当key不再被引用时,发生垃圾回收,则回将映射关系从map中移除
虚引用:完全不能决定对象的生命周期,PhantomReference,搭配ReferenceQueue一起使用
你常见的JVM异常
StackOverFlowError: 栈溢出
OutOfMemoryError:java heap space
OutofMemoryError: GC overhead limit意味着GC次数很多,但是没效果,反而引起CPU过高
OutOfMemoryError: Direct buffer memory  NIO MetaSpce is in native memory now
OutOfMemoryError: unable to create new native thread 因为一个进程能创建的线程数是有限的,比如
linux限制一个进程能创建1024个线程,理论值。
OutOfMemoryError: MetaSpace
垃圾回收算法及垃圾回收器
标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
复制算法:它将可用内存按找一定比例分配,每次回收都复制到某个区。参考新生代。
标记-整理算法:不像复制算法那样去浪费一部分空间,而是标记-清除,之后再将对象整理到一侧去。
分代收集算法:即不同的代用不同的算法。
串行垃圾垃圾回收器:它为单线程环境设计,会暂停所有的用户线程。
并行垃圾回收器:多个垃圾收集线程并行工作,此时用户线程是暂停的。
CMS并发垃圾回收器:可以和用户线程一同进行
G1:
默认的垃圾收集器有哪些
Serial收集器:串行收集器,STW,不代表只用一个CPU或一个线程去回收,而是代表必须暂停其他所有的工作线程,
直到它收集结束。Client模式新生代默认。采用复制算法,gc日志有DefNew字眼,默认老年代搭配为Serial Old

ParNew:Serial收集器的多线程版本。Server模式下,新生代的首选,目前它是除了Serial收集器之外,唯一能够与
CMS收集器配合工作的。对于单核CPU不见得比Serial好。当新生代使用ParNew默认老年代搭配为SerialOld,当使用
-XX:+UseConcMarkSweepGC,那么新生代就会默认为ParNew。采用的是复制算法,gc日志带有ParNew字眼。

Parallel Scavenge: 也是一个并行垃圾收集器,但是它注重吞吐量。
1.设置最大垃圾回收时间,以牺牲新生代空间和吞吐量为代价
2.能设置吞吐量
3.-XX:+UseAdaptiveSizePolicy,一种自适应策略,虚拟机根据当前系统的运行情况收集性能监控信息,动态调整
-Xmn、Eden与Survivor比例等。复制算法。默认和Paralle Old搭配。gc日志有PSYoungGen

SerialOld:Serial收集器的老年代版本,标记整理算法,使用场景:
1.与Paralledl Scavenge收集器搭配使用。
2.作为CMS收集器的后备预案。

Paralle Old:Paralle Scavenge收集器的老年代版本,因为Parralel Scavenge和SerialOld搭配使用,吞吐量
甚至还不如ParNew+CMS这样的组合,直到Parallel Old的出现,一切开始改变。

CMS收集器:一款以获取最短回收停顿时间为目标的收集器。并发标记清除。
 
G1:它将整个Java堆划分为多个大小相等的独立区域,虽然还保留有新生代、老年代的概念,但新生代和老年代不再是
物理隔离的,它们都是一部分Region的集合。
JVM client模式与Server模式的区别
编译器方面:虚拟机运行在client模式时,使用的是一个代号为c1的轻量级编译器,而server模式启动时,虚拟机采用
的是相对重量级,代号为c2的编译器;c2相对c1编译彻底,服务起来后,性能更高。

gc方面:client模式下的新生代默认为Serial单线程版,而server模式下默认为Serial多线程版。
启动方面:client模式启动快,编译快,内存占用少,针对桌面应用程序设计,优化客户端环境启动时间。

server模式启动慢,编译更完全,编译器是自定义编译器,效率高,针对服务端应用设计,优化服务器的最大化
程序执行速度。
谈谈G1收集器
G1将新生代,老年代的物理空间划分取消了,取而代之将堆划分为若干个区域,它仍属于分代收集器。
这些区域有Eden、Survivor、Old、Humongous。G1在回收时将对象从一个区域复制到另一个区域,完成了清理工作。
这就意味着,G1可以进行整理,不会产生内存碎片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值