网站建设与管理案例教程在线阅读,广州网站建设公司品牌,域名还在备案可以做网站吗,个人网站免费申请JVM的位置
在操作系统之上#xff0c;可以想象成一个软件#xff0c;Java程序都运行在上面
JVM结构图 JVM调优的位置
99%的调优在堆中#xff0c;极少数在方法区中 很多第三方插件都是在执行引擎那块地方做出修改而来#xff0c;比如Lombook在程序运行时动态生成get/s…JVM的位置
在操作系统之上可以想象成一个软件Java程序都运行在上面
JVM结构图 JVM调优的位置
99%的调优在堆中极少数在方法区中 很多第三方插件都是在执行引擎那块地方做出修改而来比如Lombook在程序运行时动态生成get/set方法就是一个例子
类加载器加载.class文件 Java核心的类库是Rt.jar可以解压缩里面有许多class文件 双亲委派机制
该机制是用来保证程序安全的 委派流程 1.类加载器收到类加载的请求! 2.将这个请求向上委托给父类加载器去完成一直向上委托直到到达启动类加载器向上检索向下执行APP-EXC-BOOT 3.启动加载器检查是否能够加载当前这个类能加载就结束使用当前的加载器否则抛出异常CLassNotFound~通知子加载器进行加载 4.重复步骤3
Eg可以看到明明有main方法却报错显示没找到这是因为双亲委派机制的存在我的类名为StringBootStrap加载到了java.lang.String类也就是rt.jar中的那个而那个类里面没有main方法也就是说根本没有加载到自己写的String类所以会出现下面的异常。因此这个事情告诉我们不要乱给类命名 为什么双亲委派机制能保证程序的安全通俗来讲就是有了“双亲”的监督让程序更加的规范符合JVM的环境JRE
Native
native :凡是带了native 关键字的说明java的作用范围达不到了会去调用底层c语言的库!会进入本地方法栈 通过JNI调用本地方法本地接口 JNT作用:扩展ava的使用融合不同的编程语言为ava所用!最初就有: C、C。 Java诞生的时候C、C横行想要立足必须要有调用c、C的程序~ 它在内存区域中专门开辟了一块标记区域:Native Method Stack登记native方法 在最终执行的时候,加载本地方法库中的方法通过JNI Java程序驱动打印机管理系统这些都需要去调用本地方法。在企业级应用中较为少见! Eg:调用其他接口的方式有Socket、web Service、HTTP、Restful、Rpc
Native Method Stack
它的具体做法是Native Method Stack 中登记native方法在( Execution Engine )执行引擎执行的时候加载Native Libraies。【本地库】
PC寄存器
程序计数器:Program Counter Register 每个线程都有一个程序计数器是线程私有的就是一个指针指向方法区中的方法字节码用来存储指向像一条指令的地址也即将要执行的指令代码)在执行引擎读取下一条指令是一个非常小的内存空间几乎可以忽略不计
方法区
Method Area方法区 方法区是被所有线程共享所有字段和方法字节码以及一些特殊方法如构造函数接口代码也在此定义简单说所有定义的方法的信息都保存在该区域此区域属于共享区间; 静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中但是实例变量存在堆内存中和方法区无关
栈
栈内存主管程序的运行生命周期和线程同步当线程结束栈内存也就释放了对于栈来说不存在垃圾回收问题 栈内存中主要存储八大基本类型对象引用实例的方法
先进后出main方法最先执行在栈底所以是最后出栈。 递归造成栈溢出的原因就是反复的互相调用方法不断地入栈并且执行的方法不能得到结束无法出栈。使得调用的方法越来越多造成栈溢出
三种JVM
sun - HotSpotBEA - JRocketIBM J9 VM
堆
Heap一个JVM只有一个堆内存堆内存的大小是可以调节的。 类加载器读取了类文件后一般会把什么东西放到堆中?类方法常量变量~保存我们所有引用类型的真实对象; 堆内存中还要细分为三个区域:
1.新生区类诞生和成长的地方甚至死亡。其中的伊甸园区是所有的new对象发生的地方。 2.养老区 3.永久区 主要存放加载的Class类级对象如class本身methodfield等等 幸存区0和1在堆内存中是一个动态变化的情况他是伊甸园区和养老区之间的一个过渡顾名思义无法幸存的对象会被“kill”GC垃圾回收主要在新生区中的伊甸园区和养老区进行。回收的方式分为轻GC与重GC其中轻GC主要存在于新生区只有当进入老年区的垃圾对象超过限额才会触发重GCfull GC该操作主要存在于养老区。 在开发中可能遇到OOM的问题表示内存不够这个内存也就是JVM的堆内存比如下面这个例子 Exception in thread “main” java.lang.OutOfMemoryError: Java heap space 99%的对象都是临时对象所以经过GC之后很少有进入到老年区中因此OOM的情况也很少发生
永久区的演变
这个区域常驻内存的。用来存放IDK自身携带的Class对象。Interface元数据存储的是Java运行时的一些环境或类信息这个区域不存在垃圾回收!关闭VM虚拟机就会释放这个区域的内存
jdk1.6之前︰永久代常量池是在方法区; jdk1.7︰永久代但是慢慢的退化了去永久代常量池在堆中 jdk1.8之后:无永久代常量池在元空间
永久区内存崩溃的情况一个启动类加载了大量的第三方jar包。Tomcat部署了太多的应用大量动态生成的反射类。不断的被加载。直到内存满就会出现OOM; 默认情况下分配的总内存是电脑内存的四分之一初始化的内存是电脑内存的六十四分之一 但是这些内存参数是可以人为调整的 可以看出元空间逻辑上存在但物理上并不存在
出现OOM如何去排查
可以使用内存快照工具分析对象主要有:MATEclipseJprofileIDEA两种工具。 向VM传入以下参数即可
当程序运行出现OOM进入类所在的文件目录下去寻找Jprofile生成的hprof文件即可。
双击打开即可初步发现占用大量内存的对象俗称“大对象”
查看线程Thread Dump即可发现程序中出现问题的所在行。
调优参数