从控制台看Java版本

javavisualvm 怎么使用 java visualvm分析_用户线程

HotSpot

它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 最初并非由Sun公司开发,而是由一家名为“Longview Technologies”的小公司设计的。

HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势, 如它名称中的HotSpot指的就是它的热点代码探测技术。

JVM Client/Server是两套不同的机制

Java语言可以做C/S,也可以做B/S

Client是对桌面级应用的内存分配做优化。桌面系统一次只能按一个按钮,线程少很多。内存分配的空间,相比Server要小一些。

B/S是可以并发的,Server把内存分配的空间比较大。在内存比较紧张的情况下,可能会造成空间浪费。


一、JVM总体结构图

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_02


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_03


javavisualvm 怎么使用 java visualvm分析_Java_04


二、JVM堆结构图及分代

javavisualvm 怎么使用 java visualvm分析_用户线程_05


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_06

图:Java堆示意图,对象创建后,若不被回收,会从左到右一步一步走。

年轻代(Eden对象创建初始化的地方,垃圾回收率是最高的,大约80%、From、To)、老年代、持久代

javavisualvm 怎么使用 java visualvm分析_Java_07

1、新生代

整个过程,说白了就是,折腾这一堆对象,看谁能进入老年代。

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_08

2、老年代

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_09

3、永久代(JDK1.7之后,逐渐不使用)

javavisualvm 怎么使用 java visualvm分析_Java_10

三、JVM中垃圾回收算法

1、引用计数 (Reference Counting)

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_11

2、复制 (Copying)(比如Survivor区)

javavisualvm 怎么使用 java visualvm分析_JVM_12

绿色是需要被复制的对象,蓝色的是空的,灰色的是即将被回收的对象,橘色的是空的。

javavisualvm 怎么使用 java visualvm分析_Java_13

3、标记-清除 (Mark-Sweep)

javavisualvm 怎么使用 java visualvm分析_用户线程_14


javavisualvm 怎么使用 java visualvm分析_JVM_15


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_16

4、标记-整理(Mark-Compact)

javavisualvm 怎么使用 java visualvm分析_Java_17


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_18


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_19


四、JVM中的垃圾收集器

如果说,垃圾回收算法是方法论的话,那么垃圾收集器就是对该方法论的具体实现。

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_20


javavisualvm 怎么使用 java visualvm分析_Java_21

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_22

HotSpot中的分代收集器

javavisualvm 怎么使用 java visualvm分析_用户线程_23


javavisualvm 怎么使用 java visualvm分析_JVM_24

javavisualvm 怎么使用 java visualvm分析_用户线程_25


javavisualvm 怎么使用 java visualvm分析_用户线程_26


不想过长地占用工作线程的时间(减少用户线程等待的时间)

javavisualvm 怎么使用 java visualvm分析_Java_27

收集器配合关系:

javavisualvm 怎么使用 java visualvm分析_Java_28


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_29


解决吞吐量的问题,通过减少

吞吐量 = CPU运行用户程序的时间 / CPU运行用户程序的时间+GC耗时

javavisualvm 怎么使用 java visualvm分析_用户线程_30

javavisualvm 怎么使用 java visualvm分析_JVM_31


javavisualvm 怎么使用 java visualvm分析_JVM_32


javavisualvm 怎么使用 java visualvm分析_Java_33


javavisualvm 怎么使用 java visualvm分析_Java_34


javavisualvm 怎么使用 java visualvm分析_Java_35

并发(包含用户线程):GC线程一边回收工作,用户线程一边运行
并行(不包含用户线程):用户线程停止在安全点上,多个GC的线程一起工作

含有Parallel的收集器都是并行收集器,是不能和用户线程同时运行的。含有Concurrent的收集器可以和用户线程同时工作。

年轻、老年代的回收期可以这样组合:

javavisualvm 怎么使用 java visualvm分析_Java_36

javavisualvm 怎么使用 java visualvm分析_JVM_37


JDK1.7加入

javavisualvm 怎么使用 java visualvm分析_JVM_38


五、JVM优化

JDK自带的小工具:在jdk bin目录下

C:\Program Files\Java\jdk-11.0.3\bin

javavisualvm 怎么使用 java visualvm分析_Java_39



javavisualvm 怎么使用 java visualvm分析_用户线程_40

Visualvm从JDK9开始就不再打包在jdk里面了,可以从官方下载:https://visualvm.github.io/download.html

安装完成后,可以下载使用强大的Visual GC插件

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_41


运行了一个爬虫,效果如下:

javavisualvm 怎么使用 java visualvm分析_Java_42

获取当前虚拟机的信息

javavisualvm 怎么使用 java visualvm分析_JVM_43

在Eclipse的Run Configurations中,修改垃圾收集器

javavisualvm 怎么使用 java visualvm分析_Java_44


Eclipse调优

javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_45


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_46


javavisualvm 怎么使用 java visualvm分析_JVM_47


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_48


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_49


javavisualvm 怎么使用 java visualvm分析_用户线程_50


javavisualvm 怎么使用 java visualvm分析_javavisualvm 怎么使用_51


javavisualvm 怎么使用 java visualvm分析_Java_52


javavisualvm 怎么使用 java visualvm分析_Java_53


javavisualvm 怎么使用 java visualvm分析_Java_54


javavisualvm 怎么使用 java visualvm分析_用户线程_55


javavisualvm 怎么使用 java visualvm分析_用户线程_56