JVM学习
IDEA_TEYU_1112
其实吧压力也没那么大
展开
-
java虚拟机线程安全的实现方式(阻塞式同步与非阻塞式同步)
java虚拟机线程安全的实现方式:一 阻塞式同步(互斥同步)1.synchronized也是这种同步方式。2.主要存在的问题就是进程阻塞和唤醒所带来的性能问题。3.它是一种悲观并发策略,无论共享数据是否真的出现竞争,都要进行加锁。二 非阻塞式同步1.它是基于冲突检测的乐观并发策略。先进行先操作,如果没有争用就成功了,如果有争用,则产生冲突,再采取其他的补偿措施。...原创 2019-12-22 16:45:35 · 297 阅读 · 0 评论 -
java语言线程的安全可以按照安全程度分为五个等级(不可变,绝对的线程安全,相对线程安全,线程兼容,线程对立)
java语言线程的安全可以按照安全程度分为五个等级:一 不可变1.不可变的对象一定是线程安全的,无论是对象的方法实现还是调用者,都不需要再采取任何的线程安全保障措施。2.不可变带来的安全性是最纯粹的最简单的。3.final关键字就可以做到不可变。二 绝对的线程安全1. 不管运行时环境如何,调用者都不需要任何额外的同步措施。2.通常代价是很大的,容易不切实际。3.AP...原创 2019-12-22 16:34:43 · 935 阅读 · 0 评论 -
java线程调度的两种方式(协同和抢占)
java线程调度的两种方式:一 协同线程调度1.线程自己的工作执行完后,要主动通知系统切换到另一个线程上。2.好处是实现简单,没有什么线程同步问题。3.如果一个线程编写有问题,一直不告知系统进行线程切换,那么程序就会一直阻塞在那里。4.线程的执行时间是由自身掌控的。二 抢占式调度1.线程将由系统来分配执行时间,线程的切换不由线程自身决定。2.不会出现一个线程导致整个...原创 2019-12-22 16:23:30 · 1536 阅读 · 0 评论 -
java虚拟机高效并发中的先行发生原则
java虚拟机高效并发中的先行发生原则:它是判断数据是否存在竞争,线程是否安全的主要依据。虚拟机中有着天然的先行关系,如果两个操作不在此列或者无法从他们推导,那么他们就是不安全的,可重排序的,这时就需要一些安全加锁操作了。1.程序次序规则:在一个线程内,按照程序代码的顺序,书写在前面的操作先行于书写于后面的操作。准确的说,应该是控制顺序,因为还有分支和循环结构存在。2.管程锁定规则:一...原创 2019-12-22 16:18:04 · 207 阅读 · 0 评论 -
java虚拟机volatile变量的特殊规则
java虚拟机volatile变量的特殊规则1.它是java虚拟机提供的最轻量级的同步机制。2.可见性,当一条线程修改了这个变量的值,新值对于其他线程来说是立即得知的。3.由于volatile变量只能保证可见性,当不符合下面两条规则的时候,我们仍然需要通过加锁来保证原子性。(1)运算结果不依赖变量的当前值,如自增操作++。或能够保证只有单一一个线程修改变量的值。(2)变量不需要...原创 2019-12-22 16:04:23 · 245 阅读 · 0 评论 -
计算器的处理器运行速度很快,但是内存读取很慢,IO操作又不可避免,计算机是怎么做的呢?
计算器的处理器运行速度很快,但是内存读取很慢,IO操作又不可避免,计算机是怎么做的呢?利用高速缓存,加入一层读写速度尽可能接近处理器运算速度的高速缓存作为内存与处理器之间的缓冲。...原创 2019-12-20 15:49:51 · 716 阅读 · 0 评论 -
java虚拟机晚期(运行期)优化,即时编译器
1 概念:当虚拟机发现某个方法或者代码块的运行特别频繁时,就会把这些代码认定为热点代码。为了提高热点代码的执行效率,在运行的时候,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种程度层次的优化,完成这个任务的编译器称为即时编译器。2 热点代码分为两类:被多次调用的代码被多次执行的循环体3 热点探测的方法:基于计数器的热点探测,有方法调用的计数器用来记录方法调用的次数...原创 2019-12-20 15:46:36 · 176 阅读 · 0 评论 -
java虚拟机中javac编译器编译的三个过程
java虚拟机中java编译器编译的三个过程一 解析与填充符号表1.词法分析:将源代码的字符流转变为标记token集合。单个字符是编写过程的最小元素,而标记则是编译过程的最小元素。例如:int a=b+2 这样就会生成6个标记。int,a,=,b,+,22.语法分析:根据token序列构造抽象语法树的过程。抽象语法树是一种用来描述程序代码语法结构的树形表达形式,语法树的每一个节点都...原创 2019-12-20 14:12:27 · 542 阅读 · 0 评论 -
java虚拟机运行时栈帧的结构
java虚拟机运行时栈帧的结构:局部变量表,操作数栈,动态链接,方法返回地址等。一局部变量表1.变量值的存储空间,用于存放方法参数和方法内部定义的局部变量。2.在方法的code属性的max_locals中确定局部变量表的最大容量。二操作数栈1.主要利用它的入栈和出栈的操作做一些过程操作。2.比如算术运算,调用其它方法的时候是通过操作数栈来进行参数传递的。三动态链接1...原创 2019-12-19 19:35:22 · 196 阅读 · 0 评论 -
类加载器的双亲委派模型
类加载器的双亲委派模型首先不用管上面图的各种加载器,他们属于类加载器的不同类型。如果收到了类加载的请求,首先不会自己去尝试去加载,而是去找父类看看行不行,父类仍然还会继续往上找,直到不行为止,这就是双亲委派模型。例子:object类最后都会委派到启动加载器来加载,这样才可以保证object的唯一性(类的唯一性是由类和类的加载器一起确定的)。如果没有双亲委派模型,这样就会产生不同的o...原创 2019-12-19 19:13:11 · 181 阅读 · 0 评论 -
类与类的加载器一同确立了此类在虚拟机中的唯一性
类与类的加载器一同确立了此类在虚拟机中的唯一性例子:同一个类,如果被不同加载器加载,这两个类就是不同的。原创 2019-12-19 19:04:15 · 228 阅读 · 0 评论 -
java虚拟机类加载的过程(加载,验证,准备,解析,初始化)
java虚拟机类加载的过程:加载,验证,准备,解析,初始化一.加载(此加载非彼加载)1.通过一个类的全限定名来获取定义此类的二进制流。此处并没有指定二进制流从哪里获取,它可以从class文件中获取,也可以从网上获取,这也是类加载过程中可控性最大的一个部分。2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3.在内存中生成一个代表这个类的java.lang.cla...原创 2019-12-19 11:13:20 · 270 阅读 · 0 评论 -
java虚拟机类加载的时机与类的生命周期
类的生命周期:类加载的时机:其实何时加载并没有明确的约束,但是何时进行初始化有五个明确的约束。原创 2019-12-18 11:01:11 · 203 阅读 · 2 评论 -
java虚拟机class类文件的结构
java虚拟机类文件的结构,首先来看一下大概框架。此文章中的u1,u2,u4,u8分别表示一个字节,两个字节,四个字节和八个字节的无符号数。一.魔数1.类文件的头4个字节为魔数。2.唯一作用是确定这个文件能否能被虚拟机接受,即身份识别。3.不用扩展名的原因是这样更加的安全。二.版本号1.紧接着魔数后面的4个字节,56字节是次版本号,78字节是主版本号。三.常量池...原创 2019-12-18 09:56:27 · 262 阅读 · 0 评论 -
java虚拟机调优案例一高性能硬件上的程序部署策略
java虚拟机调优案例一高性能硬件上的程序部署策略案例:原因:解决方式一:通过64位jdk来使用大内存方式一需要考虑的问题:方式二使用若干个32位虚拟机来建立逻辑集群方式二需要考虑的问题...原创 2019-12-15 15:51:53 · 228 阅读 · 0 评论 -
java虚拟机对象内存分配的规则
java虚拟机对象内存分配的规则1.对象优先在新生代eden区分配,当eden区没有足够的空间的时候,虚拟机将发起一次minor GCMinor GC发生在新生代的GC,Major GC发生在老年代的GC2.大对象直接进行老年代,避免eden区的两个survivor区之间放生大量的内存复制新生代采用复制算法,eden:surviror=8:1,这样复制算法只有10%的内存会被浪费。...原创 2019-12-15 11:25:39 · 251 阅读 · 0 评论 -
java垃圾收集器GC的阅读,示例解读
java垃圾收集器GC的阅读,示例解读1.33.125表示GC发生的时间,从java虚拟机启动以来经过的秒数。2.GC或FULL GC表示此次停顿的类型,FULL GC表示stop the world3.DefNew表示GC发生的区域4.3324k->152(3712k)表示 GC该区域已经使用容量->GC后该区域已经使用的容量(该区域的总容量)5.0.002...原创 2019-12-15 11:16:06 · 215 阅读 · 0 评论 -
java虚拟机的各种垃圾收集器介绍(GC收集器没有最好的,通用的,只有在某些场景下更适合的)
GC收集器没有最好的,通用的,只有在某些场景下更适合的下面来介绍各种垃圾收集器:1.serial收集器收集垃圾的时候,暂停所有工作线程,stop the world。简单高效,对于运行在client模式下的虚拟机来说是一个很好的选择,完全可以将停顿控制在几十毫秒。2.parnew收集器serial收集器的多线程版本(多个CPU下工作更好)它是许多运行在server模式下...原创 2019-12-15 10:50:11 · 189 阅读 · 0 评论 -
java虚拟机四种垃圾收集算法:标记清除,复制,标记整理,分代收集算法
java虚拟机四种垃圾收集算法:标记清除,复制,标记整理,分代收集算法1.标记清除算法首先标记出所有需要回收的对象,在标记完成之后统一回收清除。缺点是效率低,会产生大量不连续的内存碎片。2.复制算法首先将内存分为两块,当其中一块用完之后,将还活着的对象复制到另一块,清空原来的半块。缺点是将内存空间缩小为了一半。可以用这种方法回收新生代。3.标记整理算法前面的思路和标...原创 2019-12-13 14:50:15 · 359 阅读 · 0 评论 -
java虚拟机中定义的四种引用类型来表示引用的强弱:强,软,弱,虚
java虚拟机中定义的四种引用类型来表示引用的强弱:强,软,弱,虚1.强引用:类似于object obj=new object();这类的引用,只要强引用还在,垃圾收集器永远不会回收掉被引用的对象。2.软引用:有用,但并非必须,在内存溢出之前会对这些对象进行二次回收,如果没有内存溢出出现,这些就会暂时保留。3.弱引用:非必须的对象,只能生存到下一次垃圾收集之前。4.虚引...原创 2019-12-13 14:24:23 · 209 阅读 · 0 评论 -
判断java对象是否需要存活的两种算法:引用计数算法和可达性分析算法
判断java对象是否需要存活的两种算法:引用计数算法和可达性分析算法1.引用计数算法原理:每当一个地方应用,计数器值就加一,当引用失效的时候,计数器就减一。优缺点:效率很高,但是无法解决对象之间互相引用的问题,两个对象互相引用,这样这两个对象就不会消失,这样就导致不能回收了。2.可达性分析算法原理:以GC Roots作为起点,往下搜索,搜索的路径叫做引用链,如果一个...原创 2019-12-13 14:18:32 · 256 阅读 · 0 评论 -
Java方法区和运行时常量池内存溢出出现的原因,现象,以及解决思路
运行时常量池其实属于方法区的一部分运行时常量池内存溢出的原因:不断创建常量,比如字符串等。运行时常量池内存溢出的现象:java.lang.outofmemoryerror: pergen space这也间接说明了运行时常量池其实属于方法区的一部分方法区内存溢出的原因:不断创建大量的类,导致类信息过多等。比如使用框架或者对代码进行修改的时候,不会对原来的类进...原创 2019-12-13 14:12:21 · 1398 阅读 · 0 评论 -
java虚拟机栈和本地方法栈内存溢出的原因现象以及解决思路
java虚拟机栈和本地方法栈都是描述方法执行的内存模型,每个方法在执行的同时,都会创建一个栈帧,栈帧用于存储局部变量表等信息。每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈 的过程。内存溢出的原因:调用方法太多,超过了内存区域,比如多次递归之类的。内存溢出的现象:(1)线程请求的栈深度大于允许的最大深度stackoverflowerror,一般单线程才会出现...原创 2019-12-12 19:57:08 · 855 阅读 · 0 评论 -
java堆溢出的原因现象以及解决思路
java堆存在的最主要的目的就是存储实例对象(1)java堆溢出的原因:程序不断创建对象,超过了java堆的内存。(2)java堆溢出的现象:java.lang.outofmemoryerror: java heap space(3)java堆溢出的解决思路:用memory analyzer对其分析,看是泄露还是溢出。如果是泄露的话,可以通过分析找到相应的代码进行修改。如果...原创 2019-12-12 18:56:04 · 1265 阅读 · 0 评论 -
Java对象内存布局与访问定位
Java对象内存布局与访问定位原文链接https://blog.csdn.net/qq_29468573/article/details/82897288转载 2019-12-12 09:29:36 · 209 阅读 · 0 评论 -
java对象创建时在堆上内存划分的两种方法
java对象创建时在堆上内存划分的两种方法:(1)指针碰撞:java堆的内存是完整的,所有用过的内存放一边,没有用过的内存放一边,中间放着一个分隔的指针,有对象创建了,指针就向空闲处移动一定的内存区域。(2)空闲列表:java堆的内存是不完整的,用过的内存和没有用过的内存交错,虚拟机就必须来维护一个表,用来记录哪些内存是可以用的,在创建对象的时候直接在表中给分配相应的内存,并更新表。...原创 2019-12-11 21:22:21 · 384 阅读 · 0 评论 -
Java虚拟机运行时的五大区域
JAVA虚拟机运行时的五大区域1.程序计数器(1)较小的内存空间,执行程序时的行号指示器,依靠它来选择下一条需要执行的指令。(2)线程私有的区域。(3)线程执行java方法,计数器记录的是正在执行的虚拟机字节码指令的地址。(4)唯一一个没有outofmemoryerror的内存区域。2.虚拟机栈(1)线程私有的区域,生命周期与线程相同。(2)描述的是java方法...原创 2019-12-11 21:05:46 · 389 阅读 · 0 评论 -
深入理解java虚拟机pdf分享
本文章只用于编程学习资料的分享,未做任何盈利行为,如有侵权,提醒删除! 另外,本博客会不定期分享编程学习资料,欢迎关注!链接:https://pan.baidu.com/s/12lkUgYxmq4tVCMeQPFHLJQ 提取码:0g7k...原创 2019-04-22 18:53:10 · 22304 阅读 · 16 评论 -
java对象访问定位的两种方式(句柄访问和直接指针)
1.句柄访问2.直接指针原创 2019-04-01 20:09:19 · 3049 阅读 · 0 评论 -
JVM(java虚拟机)运行时数据区域(程序计数器,java虚拟机栈,本地方法栈,java堆,方法区)
JVM(java虚拟机)运行时数据区域包含大概以下7个部分:1.程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,据此来选取下一条需要执行的字节码指令,它是线程所私有的。2.java虚拟机栈线程私有,生命周期与线程相同,他所描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈,用来存储局部变量表,操作数栈,动态链接等。方法执行的过程就对...原创 2019-04-01 19:50:11 · 352 阅读 · 0 评论