从控制台看Java版本
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总体结构图
二、JVM堆结构图及分代
图:Java堆示意图,对象创建后,若不被回收,会从左到右一步一步走。
年轻代(Eden对象创建初始化的地方,垃圾回收率是最高的,大约80%、From、To)、老年代、持久代
1、新生代
整个过程,说白了就是,折腾这一堆对象,看谁能进入老年代。
2、老年代
3、永久代(JDK1.7之后,逐渐不使用)
三、JVM中垃圾回收算法
1、引用计数 (Reference Counting)
2、复制 (Copying)(比如Survivor区)
绿色是需要被复制的对象,蓝色的是空的,灰色的是即将被回收的对象,橘色的是空的。
3、标记-清除 (Mark-Sweep)
4、标记-整理(Mark-Compact)
四、JVM中的垃圾收集器
如果说,垃圾回收算法是方法论的话,那么垃圾收集器就是对该方法论的具体实现。
HotSpot中的分代收集器
不想过长地占用工作线程的时间(减少用户线程等待的时间)
收集器配合关系:
解决吞吐量的问题,通过减少
吞吐量 = CPU运行用户程序的时间 / CPU运行用户程序的时间+GC耗时
并发(包含用户线程):GC线程一边回收工作,用户线程一边运行
并行(不包含用户线程):用户线程停止在安全点上,多个GC的线程一起工作
含有Parallel的收集器都是并行收集器,是不能和用户线程同时运行的。含有Concurrent的收集器可以和用户线程同时工作。
年轻、老年代的回收期可以这样组合:
JDK1.7加入
五、JVM优化
JDK自带的小工具:在jdk bin目录下
C:\Program Files\Java\jdk-11.0.3\bin
…
Visualvm从JDK9开始就不再打包在jdk里面了,可以从官方下载:https://visualvm.github.io/download.html
安装完成后,可以下载使用强大的Visual GC
插件
运行了一个爬虫,效果如下:
获取当前虚拟机的信息
在Eclipse的Run Configurations
中,修改垃圾收集器
Eclipse调优