1.JVM的构成 JVM虚拟机主要是由三个部分构成,分别是类加载子系统、运行时数据区、执行引擎。 类记载子系统 Java虚拟机把描述类的数据从Class文件加载到内存民兵队数据进行校验、转换解析和初始化,最终形成可以 被虚拟机直接使用的Java类型。 运行时数据区 Java虚拟机在执行Java程序的过程中会把它锁管理的内存划分为若干个不同的数据区域。 这些区域有各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。 程序计数器:记录没一个线程的执行位置 javap -c Test1.class >t1.txt,将class的汇编编码输出到t1.txt中,其中code的编号对应的是 计数器的编号。 栈:描述的是java方法执行的线程内存模型,一个方法对应一个栈帧,一个栈帧中,局部变量表,动态链接, 方法出口,虚拟机的栈和线程是同步的。 动态链接:java中调用redis服务 操作数栈: 局部变量表: Java堆区:java堆是被线程共享的一块区域。 堆内存中分为年轻代、老年代、永久区。 2.jvm的运行参数 标准参数java -version java -Dstr/-Dserver.port -X参数 -Xms -XX参数(使用率高) -XX:newSize年轻代大小 布尔类型 -XX:+DIsableExplicitGC手动调用gc操作 非布尔类型 -Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。 -Xmx2048m= -XX:MaxHeapSize,设置jvm最大对内存为2048M -Xmx512m = -XX:InitialHeapSize,设置jvm处室对内存大小为512m 一般设置为一样大,适当利用服务器资源,能让程序运行的更快, 3.查看正在运行的程序的参数 jps -l查看运行程序的编号 jinfo -flags 10108查看10108对应的启动参数 jinfo -flag MaxHeapSize 10108查看具体某一个参数 jstat查看堆内存各部分的使用量,占用的空间,运行的时间 jstat -class 10108 jstat -gc 10108查看垃圾回收器的情况 4.内存溢出的定位与分析:不断将数据写入一个集合中,出现了死循环,读取超大的文件等,都可能造成内存溢出。 内存溢出:程序在申请内存时,没有足够的内存空间供其使用,出现out of memory 内存泄露:程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,内存泄露堆积后果很严 重 ,无论多少内存,迟早会被占光。 -XX:+HeapDumponOutOfMemoryError 指定路径 -XX:+HeapDumponOutOfMemoryError -XX:HeapDumpPath=F:test.dump.hprof 在mat中分析定位问题



