jvm的结构,已经垃圾回收

Posted xiaoqingfeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jvm的结构,已经垃圾回收相关的知识,希望对你有一定的参考价值。

jvm:

img

  1. jvm 内存结构
  2. jvm 调优参数
  3. **99%**的情况就是在调堆和方法区,
  4. 栈和计数器是不可能有垃圾的
  5. 什么是类加载?
  6. 作用:加载Class文件初始化变成对象 Class
  7. 何时类加载?
  8. new一个对象时
  9. java的类加载流程?
  10. 加载->初始化->实例化
  11. 知道哪些类加载器。类加载器之间的关系?
  12. 应用程序加载器->扩展类加载器->根加载器->虚拟机自带的加载器
  13. 类加载器之间的关系?
  14. 类加载器的双亲委派 (结合tomcat说一下双亲委派)
  15. 类加载器收到类加载的请求->将这个请求向上委托给父类加载器去完成,一直向上委托,直到根加载器->先在根加载器寻找,找到就加载,没找到就向拓展类的加载器,再没找到就向应用加载器寻找。
  16. 向上委派,向下执行,
  17. 每个人都是懒狗自己不想加载,都想让自己上面的人加载,上面没有自己才加载
  18. tomcat:
  19. 为什么需要双亲委派
  20. 保证类的安全,防止恶意代码去干涉善于的代码
  21. native
  22. 凡是带了的native关键字的说明java的作用范围达不到了,回去调用底层C语言的库!
  23. 会调用本地方法接口,JNI
  24. JNI扩展JAVA的使用,融合不同的编程语言
  25. JAVA在内存区域中专门开辟的一块标记区域:Native Method Stack,等级native方法
  26. 在最终执行的时候,加载本地方法库中的方法通过JNI
  27. 方法区
  28. 方法区是被所有的线程共享,所有的字段和方法的字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,所有定义的方法的信息都保存在该区域,此区域属于共享区间
  29. 静态变量,常量,类信息(构造方法,接口定义),运行时的常量池都存在方法区中,但实例变量存在堆内存中,和方法区无关
  30. static final Class 运行时的常量池(1.8后字符串常量池的在堆里) 方法池里就存这么多东西!
  31. Java内存模型
  32. 栈中存放什么数据,堆中呢?
  33. 栈主管程序的运行,生命周期和线程同步;线程结束,栈内存也就释放
  34. 栈里具体怎么存,画出一个对象实例化的过程中的内存中
  35. 栈存放的数据:八大基本类型+对象引用+实例方法
  36. 栈的运行原理:栈帧
  37. 堆里:对象具体实例

img

两个栈帧

  1. 大对象放在哪个内存区域
  2. 大对象直接进入养老区
  3. 堆区如何分类
  4. 新生区:所有的对象在这new出!
  5. 幸存区
  6. from区
  7. to区
  8. 养老区:如果GC15次(可以调优可以设置)没有死掉对象会来到养老区
  9. 永久区(1.8以后去掉了永久区改为元空间):这个区域常住内存。用来存放JDK自身携带的Class对象,存储的是JAVA运行时的一些环境或类信息~,这个区域不存在垃圾回收
  10. GC回收大部分在新生代和幸存区 有时在老年区
  11. 垃圾回收有哪些算法
  12. 标记清除法, 缺点是两次扫描严重浪费时间,会产生内存碎片
  13. 标记整理,标记清除的优化防止内存碎片
  14. 复制算法,好处是没有内存碎片,坏处浪费了一半内存,多一半空间to区永远是空
  15. 引用计数器(不常用)

img

常用的算法的优劣,没有最好的但有最合适的

  1. GC垃圾回收,主要在新生区和养老区
  2. GC的全流程
  3. GC中新生代用什么回收方法?
  4. 复制算法
  5. GC中老年代用什么回收方法?
  6. 标记清除+标记压缩:因为存活率较高,这样会比较省空间,当内存碎片过多就压缩一次
  7. jvm调优就是调GC在各个区用哪个算法,调出最合适的算法

img

堆的结构,方法区在元空间,元空间与堆不互通但共享物理内存

以上是关于jvm的结构,已经垃圾回收的主要内容,如果未能解决你的问题,请参考以下文章

JVM -- 垃圾回收

JVM内存管理和JVM垃圾回收机制

JVM内存管理和JVM垃圾回收机制

JVM学习--垃圾回收器

JVM垃圾回收的“三色标记算法”实现,内容太干

JVM的垃圾回收机制 总结(垃圾收集回收算法垃圾回收器)