JVM

JVM:Java Virtual Machine即java虚拟机
虚拟机:指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统

Java虚拟机详解02----JVM内存结构

Java中的内存分配

java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
具体划分为如下5个内存空间

  • :存放局部变量
  • :存放所有new出来的东西
  • 方法区:被虚拟机加载的类信息、常量、静态常量等
  • 程序计数器(和系统相关)
  • 本地方法栈

堆内存:

和程序开发密切相关
应用系统对象都保存在Java堆中
所有线程共享java堆
对分代GC来说,堆也是分代的
gc管理的主要区域

栈内存:

线程私有,生命周期和线程相同
栈由一系列帧组成(因此java栈也叫做帧栈)
帧保存一个方法的局部变量、操作数栈、常量池指针
每一次方法调用创建一个帧,并压栈

Java虚拟机详解04----GC算法和种类【重要】

  • 引用计数算法(老牌垃圾回收算法,无法处理循环引用,没有被java采纳)
  • 根搜索算法(在根搜索算法基础上,主要有下面三种)
    • 标记清除算法
    • 复制算法(新生代的GC)
    • 标记整理算法(老年代的GC)
  • 分代收集算法(新生代的gc+老年代的gc)
  • 根据对象的存货周期的不同将内存划分为几块。一般是把jva堆分为新生代和老年代:短命对象为新生代,长命对象为老年代
  • 少量对象存活,适合复制算法:在新生代中,每次gc都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成gc
  • 大量对象存活,适合用标记清理/标记整理:在老年代中,因为对象存活率高、没有额外空间对他进行分配担保,就必须使用标记清理/标记整理算法进行gc
    老年代的对象中,有一小部分是因为在新生代回收时,老年代做担保进来的对象;绝大部分对象是因为很多次gc都没有被回收掉进入老年代

Java虚拟机详解----JVM常见问题总结

类加载过程

  1. 加载:将类的class文件读入内存,并创建java.lang.Class对象
  2. 链接
  • 验证:文件格式、语法语义验证等
  • 准备:为static修饰的静态域默认初始化,并在方法区分配内存空间
  • 解析:将符号引用替换为直接引用
  1. (显示)初始化
    以下几种情况中,会执行初始化过程:
  • 创建类的实例
  • 访问类或接口的静态变量(final static修饰的常量不会对类进行显示初始化。static final修改的变量则会做显示初始化)
  • 调用类的静态方法
  • 反射
  • 初始化类的子类(子类初始化问题:满足主动调用,即父类访问子类中的静态变量、方法,子类才会初始化,,否则仅父类初始化)
  • java虚拟器启动时被表明为启动类的类
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,697评论 3 83
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,560评论 2 26
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,017评论 2 31
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,698评论 0 7
  • 导语:有些人很喜欢运动后大汗淋漓的酣畅感觉,他们认为多运动、多出汗能让身体的毒素排出去。那么,不让身体出汗和多出汗...
    GabrielSu阅读 586评论 0 0