JVM学习笔记

1、JVM启动流程

java XXX ->  装载配置(根据当前路径和系统路径查找jvm.cfg) -> 根据配置查找JVM.dll(JVM主要实现) -> 初始化JVM获得JNIEnv接口(包括findClass等操作) -> 找到main方法执行

2、JVM基本结构


2.1 PC寄存器

每个线程拥有一个PC寄存器,在线程创建时创建,它指向下一条指令的地址,执行本地方法时,PC寄存器的值为undefined。
2.2 方法区
保存装载的类信息,类型的常量池,字段,方法字节码。通常和永久区(Perm)关联在一起。JDK6时,String等常量信息置于方法。JDK7时,已经移动到堆。
2.3 Java堆
应用系统对象都保存在Java堆中,所有线程共享Java堆,对分代GC来说,堆也是分代的,同时也是GC的主要工作区间。
|eden|s0|s1|tenured|
2.4 Java栈
线程私有,栈由一系列帧组成,帧保存一个方法的局部变量、操作数栈、常量池指针,每一次方法调用创建一个帧,并压栈。
2.5 内存模型

每一个线程有一个工作内存和主存独立,工作内存存放主存中变量的值的拷贝。


2.6 可见性
一个线程修改了变量,其他线程可以立即知道。保证可见性的方法:(1)volatile(2)synchronized (unlock之前,写变量值回主存)(3)final(一旦初始化完成,其他线程就可见)
2.7 有序性
在本线程内,操作都是有序的。在线程外观察,操作都是无序的(指令重排或主内存同步延时)。

3、JVM配置参数

3.1 打印GC信息
打印GC简要信息:-verbose:gc 或者 -XX:+printGC
打印GC详细信息:-XX:+PrintGCDetails
打印CG发生的时间戳:-XX:+PrintGCTimeStamps
指定GC log的位置:-Xloggc:log/gc.log
每次一次GC后,都打印堆信息:-XX:+PrintHeapAtGC
3.2 监控类信息
-XX:+TraceClassLoading
-XX:+PrintClassHistogram
3.3 堆的分配参数
最大堆和最小堆:-Xmx20m -Xms5m  
设置新生代大小:-Xmn
设置两个Survivor区和eden的比:-XX:SurvivorRatio
3.4 堆的推荐参数
官方推荐新生代占堆的3/8,幸存代占新生代的1/10。
3.5 永久区分配参数
永久区的初始空间和最大空间:-XX:PermSize  -XX:MaxPermSize

4、GC 算法

4.1 引用计数法
对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0ÿ
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值