jvm的结构,已经垃圾回收
Posted xiaoqingfeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm的结构,已经垃圾回收相关的知识,希望对你有一定的参考价值。
jvm:
- jvm 内存结构
- jvm 调优参数
- **99%**的情况就是在调堆和方法区,
- 栈和计数器是不可能有垃圾的
- 什么是类加载?
- 作用:加载Class文件初始化变成对象 Class
- 何时类加载?
- new一个对象时
- java的类加载流程?
- 加载->初始化->实例化
- 知道哪些类加载器。类加载器之间的关系?
- 应用程序加载器->扩展类加载器->根加载器->虚拟机自带的加载器
- 类加载器之间的关系?
- 类加载器的双亲委派 (结合tomcat说一下双亲委派)
- 类加载器收到类加载的请求->将这个请求向上委托给父类加载器去完成,一直向上委托,直到根加载器->先在根加载器寻找,找到就加载,没找到就向拓展类的加载器,再没找到就向应用加载器寻找。
- 向上委派,向下执行,
- 每个人都是懒狗自己不想加载,都想让自己上面的人加载,上面没有自己才加载
- tomcat:
- 为什么需要双亲委派
- 保证类的安全,防止恶意代码去干涉善于的代码
- native
- 凡是带了的native关键字的说明java的作用范围达不到了,回去调用底层C语言的库!
- 会调用本地方法接口,JNI
- JNI扩展JAVA的使用,融合不同的编程语言
- JAVA在内存区域中专门开辟的一块标记区域:Native Method Stack,等级native方法
- 在最终执行的时候,加载本地方法库中的方法通过JNI
- 方法区
- 方法区是被所有的线程共享,所有的字段和方法的字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,所有定义的方法的信息都保存在该区域,此区域属于共享区间
- 静态变量,常量,类信息(构造方法,接口定义),运行时的常量池都存在方法区中,但实例变量存在堆内存中,和方法区无关
- static final Class 运行时的常量池(1.8后字符串常量池的在堆里) 方法池里就存这么多东西!
- Java内存模型
- 栈中存放什么数据,堆中呢?
- 栈主管程序的运行,生命周期和线程同步;线程结束,栈内存也就释放
- 栈里具体怎么存,画出一个对象实例化的过程中的内存中
- 栈存放的数据:八大基本类型+对象引用+实例方法
- 栈的运行原理:栈帧
- 堆里:对象具体实例
两个栈帧
- 大对象放在哪个内存区域
- 大对象直接进入养老区
- 堆区如何分类
- 新生区:所有的对象在这new出!
- 幸存区
- from区
- to区
- 养老区:如果GC15次(可以调优可以设置)没有死掉对象会来到养老区
- 永久区(1.8以后去掉了永久区改为元空间):这个区域常住内存。用来存放JDK自身携带的Class对象,存储的是JAVA运行时的一些环境或类信息~,这个区域不存在垃圾回收
- GC回收大部分在新生代和幸存区 有时在老年区
- 垃圾回收有哪些算法
- 标记清除法, 缺点是两次扫描严重浪费时间,会产生内存碎片
- 标记整理,标记清除的优化防止内存碎片
- 复制算法,好处是没有内存碎片,坏处浪费了一半内存,多一半空间to区永远是空
- 引用计数器(不常用)
常用的算法的优劣,没有最好的但有最合适的
- GC垃圾回收,主要在新生区和养老区
- GC的全流程
- GC中新生代用什么回收方法?
- 复制算法
- GC中老年代用什么回收方法?
- 标记清除+标记压缩:因为存活率较高,这样会比较省空间,当内存碎片过多就压缩一次
- jvm调优就是调GC在各个区用哪个算法,调出最合适的算法
堆的结构,方法区在元空间,元空间与堆不互通但共享物理内存
以上是关于jvm的结构,已经垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章