JVM

类是模板是抽象的,对象是具体的;算法没有最优,只有最合适
从硬件角度:硬件只能执行机器码,所以JVM会将字节码翻译成机器码,而翻译有两种方式:第一种是逐条将字节码翻译成机器码;第二种是即时编译,即将一个方法中所包含的所有字节码编译成机器码
在这里插入图片描述
栈:栈是数据结构,栈主管程序的运行,生命周期和线程同步,线程结束,栈over,每启动一个线程JVM就给他分配一个java栈,以栈帧为单位保存线程的运行状态(栈中的数据:原始类型和对象的引用),栈可以分为面向java方法的java方法栈,面向本地方法的本地方法栈(用C++或c语言写的Native方法),以及存放各个线程执行位置的pc寄存器

堆:一个jvm只有一个堆内存,堆内存大小是可以调节的。类加载器读取类文件后会把对象也只存放对象本身到堆中
在这里插入图片描述
堆有新生代、幸存区、老年区、方法区是特殊的堆,而java执行GC(垃圾回收)是在堆中,这里就涉及到GC的算法,GC算法有:标记清除法、标记压缩、复制算法;这三种算法都是为了更好的清除不使用的对象,释放内存空间。标记清除法清除未标记的对象,不需要额外的内存空间,有内存碎片;标记压缩法,将留下来的被标记的对象压缩;复制算法没有内存碎片,但需要额外的空间。根据三种算法可以总结:算法没有最优,只有最合适。

方法区:存储每个类的信息(类名、类方法、字段信息)里面有常量池

类加载时会用到双亲委派机制,作用是为了安全,运行原理是,先检查自己是否加载过class,没有就向上递归APP(当前)–>Exc(扩展)–>BOOT(根),当到达Boot层还是没有加载过就会考虑自己能否加载,如果不能就会下沉到子加载器去加载,一直到最底层,如果没有任何加载器能加载,就会抛出classNotFoundException。这种机制的好处是如果有人想替换系统级别的类如String.java,而这些系统类在这种机制下已经被BootStrap classLoader加载过了。

从内存中读取或写入数据的过程都比CPU执行指令的速度慢得多,所以用高数缓存来解决这个问题。先将内存的数据复制一份到高速缓存中,CPU计算是直接读取高速缓存中的数据或写入数据,而这又可能会使一个变量在多个CPU中都存在缓存,使得程序出错(一般在多线程中才会出现),所以在并发编程执行时必须保证原子性、可见性、以及有序性,只要有一个没有被保证就有可能导致运行不正确。而JVM中主要通过synchronize和Lock来实现原子性、可见性、有序性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值