-
GC垃圾回收中的垃圾指的是什么?
- 简单的来说是内存中已经不再使用到的空间就是垃圾
-
如何判断一个对象是否应该回收?
- 引用计数法
- 枚举根节点可达性分析(GCRoots)
-
java中可以作为GCRoots的对象有哪些?
- 虚拟机栈中引用的对象(局部变量)
- 方法区的静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中native方法引用的对象
-
JVM的参数类型
-
标配参数
- java -version
- java -help
-
x参数(了解)
- -Xcomp:第一次使用就编译成本地代码
- -Xint:解释执行
-
xx参数
- Boolean类型
- [ ] -XX:+或者-某个属性值 +表示开启 -表示关闭 -XX:-PrintGCDetails / -XX: +PrintGCDetails - KV设值类型
- -XX:属性key=属性值value -XX:MetaspaceSize=128m/-XX:MaxTenuringThreadhold=15
- jinfo举例,如何查看当前运行程序的配置
- Boolean类型
-
你说你做过jvm优化和参数配置,请问如何盘点查看jvm系统默认值?
- java -XX:+PrintFlagsInitial
E:\spring-boot\spring-boot-quickstart>java -XX:+PrintFlagsInitial
[Global flags]
intx ActiveProcessorCount = -1 {product}
uintx AdaptiveSizeDecrementScaleFactor = 4 {product}
uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product}
uintx AdaptiveSizePausePolicy = 0 {product}
uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product}
uintx AdaptiveSizePolicyInitializingSteps = 20 {product}
uintx AdaptiveSizePolicyOutputInterval = 0 {product}
AllocatePrefetchStepSize = 16 {product}
.......
- java -XX:+PrintFlagsFinal -version
.......
intx WorkAroundNPTLTimedWaitHang = 1 {product}
uintx YoungGenerationSizeIncrement = 20 {product}
uintx YoungGenerationSizeSupplement = 80 {product}
uintx YoungGenerationSizeSupplementDecay = 8 {product}
uintx YoungPLABSize = 4096 {product}
bool ZeroTLAB = false {product}
intx hashCode = 5 {product}
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
另外说明下:= 代表修改过
- 查看默认的垃圾回收器
java -XX:+PrintCommandLineFlags -version
E:\spring-boot\spring-boot-quickstart>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=132843328 -XX:MaxHeapSize=2125493248 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
jps -l
E:\spring-boot\spring-boot-quickstart>jps -l
10016 org.jetbrains.jps.cmdline.Launcher
11504 sun.tools.jps.Jps
1572 org.jetbrains.jps.cmdline.Launcher
7252 org.jetbrains.idea.maven.server.RemoteMavenServer
10680 org.jetbrains.jps.cmdline.Launcher
2488 com.demo.springbootquickstart.SpringBootQuickstartApplication
2920
jinfo -flag
````java
E:\spring-boot\spring-boot-quickstart>jinfo -flag MetaspaceSize 2488
-XX:MetaspaceSize=134217728
E:\spring-boot\spring-boot-quickstart>jinfo -flag MaxTenuringThreshold 2488
-XX:MaxTenuringThreshold=15
jinfo -flags
Attaching to process ID 2488, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:+ManagementServer -XX:MaxHeapSize=2126512128 -XX:MaxNewSize=708837376 -XX:MetaspaceSize
=134217728 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocat
ion -XX:+UseParallelGC
Command line: -XX:MetaspaceSize=128m -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=51823 -Dcom.sun.management.jmxremote.authenticate
=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:E:\Idea\IntelliJ IDEA 2018.2.3\lib\idea_rt.jar=51824:E:\I
dea\IntelliJ IDEA 2018.2.3\bin -Dfile.encoding=UTF-8
-
美团的一个坑题
-Xms,-Xmx属于jvm参数类型的哪种?x?orXX?
其实-Xms,-Xmx类似数据库的别名一样,-Xms为:InitialHeapSize -Xmx为:MaxHeapSize -
你工作中用的jvm常用基本配置参数有哪些?
(-Xmx与与-Xms配成一致)- -Xms 初始大小内存,默认为物理内存的1/64 等价于 -XX:InitialHeapSize
- -Xmx 最大分配内存,默认为物理内存的1/4 等价于 -XX:MaxHeapSize
- -Xss 设置单个线程栈的大小,一般为512k~1024k 等价于 -XX:ThreadStackSize
- -Xmn 设置新生代大小
- -XX 设计元空间大小
元空间和永久代类似,都是jvm规范方法区的是实现。不过元空间和永久代最大的区别在于:元空间并不在虚拟机中而是使用本地内存。因此,默认情况下,元空间的大小受到 本地内存的限制
-
-XX:+PrintGCDetails
-Xms10m -Xmx10m -XX:+PrintGCDetailsbyte[] b = new byte[50*1024*1024]; //创建一个超大对象 模拟OutOfMemoryError
运行上述代码直接OutOfMemoryError,如下报错细信息
[GC (Allocation Failure) [PSYoungGen: 1657K->488K(2560K)] 1657K->680K(9728K), 0.0015944 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 488K->456K(2560K)] 680K->648K(9728K), 0.0009643 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 456K->0K(2560K)] [ParOldGen: 192K->623K(7168K)] 648K->623K(9728K), [Metaspace: 3213K->3213K(1056768K)], 0.0049357 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 623K->623K(9728K), 0.0044222 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java8.T.main(T.java:17)
说明:
- -XX:SurvivorRatio 默认 -XX:SurvivorRatio=8,Eden:SO1:SO2=8:1:1 美[ˈreɪʃioʊ]
- -XX:NewRatio 新生代与老年代的比例 默认-XX:NewRatio =2 新生代1 老年代2 一般不用调
- -XX:MaxTenuringThreshold 设置垃圾最大年龄 默认-XX:MaxTenuringThreshold=15 是有范围的我们修改只能在0-15之间
请你谈谈强引用 弱引用 软引用 虚引用分别是什么?