
深入理解Java虚拟机
为神敬酒者
此人太懒,没留下什么东西
展开
-
本地方法栈与Native方法
刚开始看《深入理解Java虚拟机》,在里面看到一句话,不是很理解:本地方法栈与虚拟机栈所发挥的作用时非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的的Native方法服务。在这里转载一篇帖子介绍什么是Native方法。http://blog.youkuaiyun.com/wike163/article/details/6635321-...转载 2018-08-18 10:07:38 · 2369 阅读 · 0 评论 -
JVM(五)----------------线程安全之锁机制
锁机制是JAVA虚拟机实现线程安全的方法之一。在这里介绍几个锁优化锁优化技术(HotSpot虚拟机而言)包括适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等。这些技术都是为了在线程之间更高效地共享数据以及解决竞争问题,从而提高程序效率。1.自旋锁与自适应自旋为什么选择自旋去消耗CPU而不直接等待?互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成...原创 2018-09-21 20:48:12 · 216 阅读 · 0 评论 -
JVM(五)----------------线程安全之同步机制
我觉得对知识的理解不仅是你看懂了书本的内容,还要在面试时能将你的理解完整地表述出来。我看了线程安全的知识,然后自问自己能否将它表述,结果失望地发现我连意思都表述不清。为此写这篇博客什么是线程安全:我看过对线程安全的一个通俗的解释是:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一...原创 2018-09-21 10:18:42 · 233 阅读 · 0 评论 -
JVM(五)----------------volatile关键字
volatile关键字有两个语义,第一个是保证可见性,第二个是禁止指令重排序。volatile的可见性:(1)synchronized与volatile的区别:volatile是线程同步的轻量级实现,只用于修饰变量,synchronized用于修饰方法和语句块;多线程访问volatile不会发生阻塞,但是synchronized会发生阻塞;volatile保证数据的可见性,...原创 2018-09-15 08:55:24 · 176 阅读 · 0 评论 -
JVM(五)-----------------Java内存模型
Java内存模型(Java Memory Model)本身是一个抽象概念,并不真实存在,它描述的是一种规范,Java内存模型的主要目标是通过这组规范去定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素(实例字段,静态字段和构成数组对象的元素主要存储于方法...原创 2018-09-12 16:31:47 · 167 阅读 · 0 评论 -
JVM(五)----------------并发的 三个特性和先行发生原则
Java内存模型是围绕着并发过程中如何处理原子性、可见性、有序性这三个特征来建立的,下面是这三个特性的实现原理:1.原子性(Atomicity) 由Java内存模型来直接保证的原子性变量操作包括read、load、use、assign、store和write六个,大致可以认为基础数据类型的访问和读写是具备原子性的。如果应用场景需要一个更大范围的原子性保证,Java内存模型还提供了lock...原创 2018-09-15 19:47:21 · 518 阅读 · 0 评论 -
深入理解JVM(三)------再谈引用与finalize()方法
Java对象的引用无论是通过引用算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判断对象是否存活都与引用有关。垃圾回收的机制主要是看对象是否有引用指向该对象在Java中类型可分为两大类:值类型与引用类型。值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class 定义的类型)。所有的类型在内存中都会分...原创 2018-08-26 12:08:38 · 596 阅读 · 0 评论 -
深入理解JVM(三)------垃圾收集器与内存分配策略(1)
在了解垃圾收集之前,我们得先知道哪些内存需要回收,哪些不需要JVM运行时数据区如上图,其中,程序计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭,而JAVA堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道创建哪些对象,这部分内存的分配和回收都是动态的,垃圾收集器所关注的就是这部分内存。...原创 2018-08-26 10:40:28 · 187 阅读 · 0 评论 -
阿里云Linux Ubuntu 16.04/Linux Ubuntu 14.04下编译OpenJDK8
最近在看深入理解虚拟机,涉及到要编译openjdk8,在下选择是阿里云Linux Ubuntu 16.04.搭建环境。如何下载OpenJDK8的源码以及安装BootstrapJDK1.7就不在这里讲了。这里主要将编译过程及配置。首先得声明,博主在Linux Ubuntu 16.04下编译open JDK1.8,当配置到最后一步执行./java -version时会报错,错误如下:这个错误不...原创 2018-08-16 18:42:42 · 480 阅读 · 0 评论 -
阿里云Ubuntu16.04下 安装openjdk-7
刚开始看深入理解虚拟机这本书,需要搭建环境编译openjdk,楼主是选择在阿里云上搭建。首先是将JDK8的源码放在了阿里云上,然后还要用到Bootstrap JDK1.7,于是又将Linux自带的jdk1.8卸载重新安装openjdk1.7. 在网上看到说,Ubuntu16.04已经将openjdk7的源移除了,需要自己添加源,要用到下面三行命令 1.sudo add-apt-rep...原创 2018-08-16 10:54:20 · 705 阅读 · 0 评论 -
虚拟机栈的两种异常
在Java虚拟机规范中,对虚拟机栈规定了两种异常状况:StackOverflowError和OutOfMemoryError。这两种异常的发生场景与具体区别在下面这篇博文链接讲的不错,粘贴过来:http://www.cnblogs.com/manayi/p/9293302.html说一下本地方法栈,本地方法栈的功能和特点类似于虚拟机栈,均具有线程隔离的特点以及都能抛出StackOverfl...转载 2018-08-18 10:54:24 · 839 阅读 · 0 评论 -
深入理解JVM(三)--------------------------虚拟机类加载机制
写这篇博客的目的是为了对已学过的知识做一下笔记总结,如果想要从这篇文章中得到一些与众不同的理解,那么可能要让各位失望了。类从被加载进虚拟机内存中开始,到卸载出内存为止,他的整个生命周期包括:加载----验证----准备----解析-----初始化----使用-----卸载1、加载阶段加载阶段有三件事情:1)通过一个类的全限定名来获取定义此类的二进制字节流2)将这个字节流...原创 2019-03-26 00:36:10 · 276 阅读 · 0 评论