
JVM
文章平均质量分 81
JVM
赵鹏翔
上海市东华大学在读研究生,大家共勉。
展开
-
Java对象的创建过程
Java对象的创建过程①类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。②分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分配方式由 Java 堆是否规整原创 2021-04-22 13:40:17 · 483 阅读 · 0 评论 -
synchronized和ReentrantLock 的区别
synchronized和ReentrantLock 的区别① 两者都是可重入锁两者都是可重入锁。“可重入锁”概念是:自己可以再次获取自己的内部锁。比如一个线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。同一个线程每次获取锁,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。②synchronized 依赖于 JVM 而 ReentrantLock 依赖于 APIsynchronized 是依赖于 JV原创 2021-04-21 19:31:43 · 318 阅读 · 0 评论 -
synchronized 关键字 整理
synchronized 关键字synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线程之间的切换时需要从用户态转换原创 2021-04-21 16:50:10 · 512 阅读 · 1 评论 -
什么是内存泄漏?有什么危害?
1、什么是内存泄漏内存泄漏是指你向系统申请分配内存进行使用(new/malloc),然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统(delete),导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。一次内存泄漏的危害可以忽略不计,但是内存泄漏堆积则后果很严重,无论多少内存,迟早会被占完,造成内存泄漏。2.Java内存泄漏引起的原因1、静态集合类引起内存泄漏:像HashMap、Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程原创 2021-04-20 23:11:13 · 5656 阅读 · 2 评论 -
从 JVM 角度了解进程和线程之间的关系
从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈和本地方法栈。总结: 线程 是 进程 划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。程序计数器为什么是私有的?程序计数器主要有下面两个作用:1.字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如.原创 2021-04-20 22:14:17 · 355 阅读 · 0 评论 -
关于 JVM JDK 和 JRE 最详细通俗的解答
JVMJava 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。(所以跨平台)什么是字节码?采用字节码的好处是什么?在 Java 中,JVM 可以理解的代码就叫做 字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java转载 2021-04-19 16:59:09 · 126 阅读 · 0 评论 -
栈和堆整理
JAVA在程序运行时,在内存中划分5片空间进行数据的存储。分别是:1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。基本,栈stack和堆heap这两个概念很重要。一、先说一下最基本的要点基本数据类型、局部变量都是存放在栈内存中的,用完就消失。new创建的实例化对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。二、先明确以上两点,以下示例就比较好理解了示例1main() int x=1;show () int x=2主函数main()中定义变量int转载 2021-03-31 16:09:45 · 118 阅读 · 0 评论 -
JVM垃圾回收
JVM垃圾回收机制分代垃圾回收不同的对象生命周期不同。与业务信息有关的对象生命周期较长,如Http请求中的session对象、线程、socket连接。程序运行过程中的临时变量生命周期较短,如String对象。把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。JVM中共划分为三个代:年轻代、年老代和持久代,其中持久代主要存放Java类的类信息,与垃圾收集要收集的Java对象关系不大,年轻代和年老代的划分是对垃圾收集影响较大的。年轻代:存放所有新生成的对象;年老代:在年轻代转载 2021-03-30 15:58:58 · 92 阅读 · 3 评论 -
JVM内存模型
**1,程序计数器**线程是cpu调度的最小单位,当多线程竞争cpu时间片段时,当线程切换时能正确的切回到指定位置,需要一个计数器记录当前执行的字节码的地址。因此,程序计数器是线程私有的一块较小的内存空间,其可以看做是当前线程所执行的字节码的行号指示器。2,本地方法栈属于线程私有,存放java的本地方法调用,java本地方法指的时native修饰的那些方法,其调用的是c,c++等方法,存放在本地方法库中。3,java虚拟机栈属于线程私有,每个方法在执行的时候会创建一个栈帧,存放局部变量表..转载 2021-03-30 15:51:12 · 91 阅读 · 0 评论