Java虚拟机(JVM 虚拟机)

1. 什么是JAVA虚拟机

所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的 VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。

2. JAVA 如何做到跨平台

同一个JAVA程序(JAVA字节码的集合),通过JAVA虚拟机(JVM)运行于各大主流操作系统平台
比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介,来实现跨平台。

3. 虚拟机基本结构–了解

3.1 类加载子系统

负责从文件系统或者网络中加载编译好的.class字节码文件,加载的类信息存放于一块称为方法区(永久带)的内存空间。

3.2 Java堆

在虚拟机启动的时候建立,它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都放Java堆中。

3.3 Java的NIO库(直接内存)堆外

允许Java程序使用直接内存。直接内存是在Java堆外的、直接向系统申请的内存空间。但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。

3.4 垃圾回收系统

垃圾回收系统是Java虚拟机的重要组成部分,垃圾回收器可以对方法区、Java堆和直接内存进行回收。

3.5 执行引擎

是Java虚拟机最核心组件之一,它负责执行虚拟机的字节码。使用即时编译技术将方法编译成机器码后再执行。

4.虚拟机堆内存结构

JVM中堆空间可以分成三个大区,年轻代、老年代、永久代(方法区)。

4.1 年轻代

所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集那些生命周期短的对象。年轻代分为三个区域:EDEN、Survivor 0(简称S0,也通常称为from区)、Survivor 1(简称S1,也通常称为to区)。其中S0与S1的大小是相同等大的。我们不必去纠结此比例(可以通过修改JVM某些动态参数来调整)的大小.只需谨记三点就好:
1、S0与S1相同大小。
2、EDEN区远比S(S0+S1)区大,EDEN占了整个年轻代的大致70%至80%左右。 
3、年轻代分为2个区(EDEN区、Survivor区)

4.2 老年代

在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。    

那一个对象到底要经过多少次垃圾回收才能从年轻代进入老年代呢?

15次

我们通常认为在新生代中的对象,每经历过一次GC(垃圾回收),如果它没有被回收,它的年龄就会被加1, 虚拟机提供了一个参数来可控制新生代对象的最大年龄:MaxTenuringThreshold。默认情况下,这个参数是15。 也就是说,在新生代的对象最多经历15次GC,就可以进入老年代。

4.3 永久代(方法区)

也通常被叫做方法区。存放JDK自带的class,interface,Meta信息。

5. 常用的JVM参数

5.1 跟踪JAVA虚拟机的垃圾回收

开启gc日志

-XX:+PrintGC  #开启gc日志
-XX:+PrintGCDetails  #打印gc日志的详细信息
-XX:+PrintGCTimeStamps #打印gc日志的时间戳
-Xloggc:filename #gc日志的路径与名字

在这里GC 日志格式支持 %p 和 %t 两个参数:

%p 将会被替换为对应的进程 PID
%t 将会被替代为时间字符串,格式为: YYYY-MM-DD_HH-MM-SS

开启gc日志

 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log”

5.2 配置JAVA虚拟机的堆空间

1.设置java堆空间:
-Xms:初始堆大小,默认值为操作系统内存的1/64
-Xmx:最大堆大小,默认最大内存为操作系统内存的1/4
# 实际生产环境中, 我们通常将初始化堆(-Xms) 和 最大堆(-Xmx) 设置为一样大,两个不超过物理内存的一半。以避免程序频繁的申请堆空间。

[root@qfedu.com bin]# vim catalina.sh   添加
JAVA_OPTS=”-server -Xms2048m -Xmx2048m  -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log”
[root@qfedu.com ~]# mkdir /data0/logs/ -p  #创建gc日志存放路径

2.重启tomcat

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容