JVM一点点

1. JVM 概念

  • java Virtual Machinal (java虚拟机)
  • 翻译字节码 .class文件 编程机器指令
  • JRE:java runtime enviroment (java运行环境) jre=jvm+java核心类库+支持文件
  • JDK:java development kit (java开发工具) jdk=jre+java工具+java类库

2.JVM内存管理

2.1 JVM运行时数据区

2.1.1 程序计数器(线程私有的,运行时才有)
  • pc :指向下一个要取的指令。指向当前线程正在执行的字节码的地址
2.1.2 虚拟机栈(线程私有的,运行时才有)
  • 栈特点:FILO 先进后出 入栈出栈只能在栈顶操作。
  • 存储当前线程运行方法时所需要的数据、指令、返回地址
  • 栈的数据结构跟java方法调用的执行和结束顺序很吻合、
2.1.2.1 栈帧
  • 栈帧:(线程私有的),每一个方法要为其分配一个运行空间 每一个方法对应一个栈帧。
  • 存放 局部变量表 操作数栈 动态链接 返回地址
  • 局部变量表:一个32位的地址 一组变量值存储空间 ,用于存放方法参数和方法内部定义的局部变量(this,a,b,c)(有一个指向整调用当前方法的对象 this变量),还有对象的引用。
public int calc(){
	int a=100;
	int b=200;
	int c=300;
	Dao dao;
	return (a+b)*c;
}
  • 操作数栈:方法的执行就对应着栈帧在虚拟机中入栈 出栈的过程
  • 动态链接:(java多态)所以 方法区中用于表示指向对象的实例
  • 返回地址:函数的返回地址
2.1.2.2 Xss

Xss:每个线程的虚拟机栈的大小

  • 异常情况:方法递归溢出 优化策略:栈的大小一般调整小一些。
2.1.3 本地方法栈(线程私有的,运行时才有)
  • 存储的是Native方法
2.1.4 堆(线程共有的)
  • 存放 所有的对象实例和数组
  • 设置参数:堆内存初始化内存分配大小,启动时分配的内存-Xms,堆内存可分配的最大内存 -Xmx
2.1.4.1 对象实例
2.1.4.2 数组
2.1.5 方法区(线程共有的)
  • 存放 类信息 静态变量 常量 编译期编译后的代码(运行时才编译的)

2.2 JVM内存模型(JMM)

  • JMM:是为了解决多线程对共享数据访问的一致性(新生代 老年代 永久代(元空间))
    • jvm的内存模型(分代思想)
2.2.1 堆
2.2.1.1 新生代(占堆空间1/3)

E ;
den: From Survivor 空间:To Survivor空间=8:1:1

  • Eden区:所有的对象都优先在Eden区分配(会被垃圾回收器清理 如果垃圾则回收 如果不是垃圾则 在T F中跳来跳去 每跳一次垃圾回收年龄+1 当年龄大于>15则进入老年代)
  • From Survivor 空间
  • To Survivor空间
    每次进行一次垃圾回收,年龄+1
2.2.1.2 老年代(占堆空间2/3)
  • 在T F中进行跳转 当年龄15 就从两个交换区进入到老年代。
  • 大对象当对象分配的空间大于的新生代(Eden),将直接进入老年代
  • 长期存活的对象将进入老年代
  • 动态年龄的判断
2.2.2 方法区
2.2.2.1 永久代(JDK<1.8)
2.2.2.2 元空间(JDK>=1.8)
2.2.3 JMM对象回收 – 判断对象的存活
2.2.3.1 引用计数算法
  • 每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
2.2.3.2 可达性分析算法Reachability Analysis:
  • 从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。
    在java,可作为GC Roots的对象包括:
  1. 方法区:类静态属性引用的对象;
  2. 方法区:常量引用的对象
  3. 虚拟机栈(本地变量表)中的对象
  4. 本地方法栈 JNI(Native方法中)引用的对象
    可达就不能回收

2.3 JVM垃圾回收

垃圾回收的重点 :堆

  • 新生代(堆):Minor GC(复制回收算法)
    只在 T F中进行复制回收算法,速度快,但是浪费空间
    (90%的对象不用去垃圾回收,但需要10%的空间去做一个预留区 ,所以 Eden:From Survivor 空间:To Survivor空间=8:1:1)
  • 老年代(堆): Full GC
    标记清除,标记整理算法。
    优先使用标记清除,如果碎片过多,就会标记整理算法,整理碎片。
    永久代(方法区):永久代里面会发生垃圾回收,
    垃圾回收算法:
  • 复制回收Copying算法:
    把内存分成等分的两份(预留区),使用率只有50%,因为要预留。
  • 标记清除算法
    回带来内存碎片问题
  • 标记整理算法
    存储空间可能不连续,碎片,所以要把空闲的都归到一起

2.3 JVM常见问题

  • 保存堆栈快照日志
  • 分析内存泄漏
  • 调整内存设置
  • 控制垃圾回收频率
  • 选择适合的垃圾回收器
    • 元空间会挤占堆的空间
  • OOM/栈溢出—重启(1)、保存堆(内存泄漏),栈(死循环,无效循环呢)日志
  • 如果修改了class文件,会发生了了什么?(OOM)
  • 类加载(双亲委派,Tomcat 不是双亲委派 )
  • 性能优化常用的性能评价(响应时间,并发数,吞吐量,相互之间的关系)
  • 常用的性能优化手段(总原则,前端性能优化手段,应用服务性能优化,存储性能优化)

哈哈哈哈,处理 优化等就超出了现在的水平老,本文章只是第一次了解JVM,只是一点点,文章也不详细,大家可以看看我转发的另一个 JVM 微笑的文章,嘻嘻嘻,继续啃。。。。未完待续。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值