JVM原理
JVM是java的核心和基础,他是在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序。
并且该虚拟处理器屏蔽了与具体操作系统平台相关的信息,使程序只需生成在JVM上运行的目标代码,即字节码文件(.class),就可以在多种平台上无差别的运行。从而实现跨平台性
其组成主要包括有字节码指令集、寄存器、栈、垃圾回收堆和存储方法域等。
class文件在运行流程大致为,(1)类加载器将class文件加载到内存空间中。(2)程序中的方法以栈帧(stack frame)存储到线程栈中----会自动释放(方法执行结束,则直接清空),其他的对象都存储到堆空间中----需手动释放。(3)指令寄存器开始执行。
其中堆空间就是垃圾回收器的主处理空间
JMM模型--Java Memory Model--Java内存模型
JMM定义了JVM在计算机内存中的工作方式。JMM与Java并发操作有关,JMM中定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。Java线程之间的通信采用的是共享内存模型,整个通信过程对程序员是完全透明的。这里提到的共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。
当线程A与线程B之间如要通信的话,需要经历2个步骤:(1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。(2)线程B到主内存中去读取线程A之前已更新过的共享变量。
垃圾回收Garbage Collectors
1,找垃圾
垃圾:没有任何引用。
- python中使用引用计数法。
- Java中使用根可达法(Root searching)-----类树的搜索算法,能遍历到的就不是垃圾,否则是。
【根-----抽象:整个方法中最先传造出对象的地方】
2,清除垃圾
垃圾回收算法
- Mark-Sweep(标记清除)-----------对垃圾进行标记,然后清除------------碎片化严重
- Copying(拷贝)------------将垃圾按有序复制到另一半的空间,再清除----浪费内存
- Mark-Compact(标记压缩)------------回收时直接整理好再清除-------------效率最低
垃圾回收器(10种)----随着内存的大小增长而演进的
新生代:刚刚诞生的对象,年轻的对象。(一次可回收)拷贝算法,
老年代:年龄为预设的X(每经历过一次垃圾回收,逐渐年龄+1)的对象。(老顽固)标记算法
查看本机的垃圾回收器配置(默认)
JVM调优
1,什么是调优
1)根据规划进行的JVM规划(预调优)
2)环境调优(运行环境满,卡顿)
3)JVM运行过程中出现的问题(Memory Leak,OOM)
2,确定位置
通过对参数进行查看,确定问题的种类,问题代码区域(一般为业务问题),进一步进行修改。
【个人程序描述:进行风险普查模型,产生了内容泄露,频繁GC但仍清除不掉,进过定位(jmap)查找到问题所在,修业业务代码进行修改】
3,方法
常用arthas开源工具
- 重启
- 换垃圾回收器