JVM运行机制

本文主要讨论以下内容:

1. JVM启动流程

2. JVM基本结构

3. 内存模型

JVM启动流程


1. 我们在启动一个JAVA程序的时候一般是通过java命令启动。
2. 运行java命令后JVM会首先加载jvm.cfg文件
3. 通过cfg找到JVM.DLL
4. jvm.dll初始化jvm并获得JNIEnv接口用来findClass
5. 最后运行class里的main函数。

JVM基本结构

关于JVM内存结构可参考 点击打开链接


这里提一下java栈
1. 线程私有
2. 栈由一系列帧组成(因此Java栈也叫做帧栈)
3. 帧保存一个方法的局部变量、操作数栈、常量池指针
4. 每一次方法调用创建一个帧,并压栈

栈的局部变量表包含参数和局部变量

public class StackDemo {


public static int runStatic(int i,long l,float  f,Object o ,byte b){
return 0;
}//对于类方法,参数或局部变量分别存储在栈



public int runInstance(char c,short s,boolean b){
return 0;
}//对于实例方法,栈的第一个指向的是对象本身


}

栈上分配

由于堆上分配会造成多次GC,因此建议在栈上进行分配,因为方法执行完后所有栈内的信息都会回收。但是对于较大的对象,或逃逸对象无法分配在栈上。


栈 堆 方法区的交互




[java]  view plain  copy
  1. public   class  AppMain       
  2.  //运行时, jvm 把appmain的信息都放入方法区  {  public   static   void  main(String[] args)    
  3. //main 方法本身放入方法区。  {  Sample test1 = new  Sample( " 测试1 " );    
  4.  //test1是引用,所以放到栈区里, Sample是自定义对象应该放到堆里面  Sample test2 = new  Sample( " 测试2 " );  test1.printName();  test2.printName();  }   
[java]  view plain  copy
  1. public   class  Sample         
  2.  //运行时, jvm 把appmain的信息都放入方法区  {  private  name;       
  3.  //new Sample实例后, name 引用放入栈区里,  name 对象放入堆里  public  Sample(String name)  {  this .name = name;  }  //print方法本身放入 方法区里。 public   void  printName()     {  System.out.println(name); } }  


JAVA内存模型

概念:
1. 每一个线程都有一个工作内存和主存独立。工作内存存放变量的值拷贝。
2. 当数据从主内存复制到工作存储时,必须出现两个动作:第一,由主内存执行的读(read)操作;第二,由工作内存执行的相应的load操作;当数据从工作内存拷贝到主内存时,也出现两个操作:第一个,由工作内存执行的存储(store)操作;第二,由主内存执行的相应的写(write)操作

3. 每一个操作都是原子的,不会被中断
4. 对于一个普通变量,一个线程的值的更改不会马上反应在其他线程,如需要马上反应则应对该变量使用volatile关键字

5. 可见性。一个线程变量的修改,其他线程可以立即知道。
6. 保证可见性的方法。volatile, synchronized(unlock前写入主内存),final关键字
7. 有序性。在本线程中,所有的操作都是有序的。但在外部线程看来,操作都是无序的(指令重排)
8. 指令重排。
JVM为提高执行效率会对代码进行重排序。
写后读 a = 1;b = a;写一个变量之后,再读这个位置。
写后写 a = 1;a = 2;写一个变量之后,再写这个变量。
读后写 a = b;b = 1;读一个变量之后,再写这个变量。
以上语句不可重排
编译器不考虑多线程间的语义
可重排: a=1;b=2;//因为对于虚拟机来说a=1和b=2没有任何关联。
例: 指令重排破坏线程有序性
[java]  view plain  copy
  1. class OrderExample {  
  2. int a = 0;  
  3. boolean flag = false;  
  4.   
  5. public void writer() {  
  6.     a = 1;                     
  7.     flag = true;             
  8. }  
  9.   
  10. public void reader() {  
  11.     if (flag) {                  
  12.         int i =  a +1;        
  13.         ……  
  14.     }  
  15. }  
  16. }  
线程A首先执行writer()方法,线程b随后执行reader()。由于writer()中a=1和flag=true是可以重排序的,因此writer()方法可能是flag=true; a=1. 因此线程B在执行a+1的时候不一定知道a已经被赋值为1.解决上面的问题可以通过对方法加锁synchronized,因为synchronized互斥,所以在b线程看到的a线程是有序的。

9. 重排序原则
程序顺序原则:一个线程内保证语义的串行性
volatile规则:volatile变量的写,先发生于读
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C 那么A必然先于C
线程的start方法先于它的每一个动作
线程的所有操作先于线程的终结(Thread.join())
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com
JVM(Java虚拟机)的垃圾回收(GC)机制是自动管理内存的一种机制。它通过自动识别和回收不再使用的对象来释放内存空间,以避免内存泄漏和程序中的内存溢出错误。 JVM中的垃圾回收器负责执行垃圾回收。当对象不再被引用时,垃圾回收器将标记这些对象为垃圾,并将它们从内存中回收。以下是JVM GC回收机制的一般过程: 1. 标记阶段(Marking Phase):从根对象(如线程栈中的引用、静态变量等)开始,垃圾回收器将遍历对象图并标记可达的对象。 2. 清除阶段(Sweeping Phase):垃圾回收器将清除标记为垃圾的对象,并回收它们占用的内存空间。 3. 压缩阶段(Compacting Phase):如果需要,垃圾回收器会对存活的对象进行整理,使它们在内存中连续排列,从而减少碎片化并提高内存的利用率。 4. 再分配阶段(Allocation Phase):如果需要,垃圾回收器会为新对象分配内存空间。 具体的垃圾回收算法和策略可能因不同的JVM实现而异。常见的垃圾回收算法包括标记-清除(Mark and Sweep)、复制(Copying)、标记-整理(Mark and Compact)等。JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)等,以满足不同场景下的需求。 总而言之,JVM的垃圾回收机制通过自动识别和回收不再使用的对象来管理内存,确保程序运行时的内存使用效率和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值