本地线程

Java线程之间通信方式

两盒软妹~` 提交于 2019-12-31 13:41:21
通信方式: 1.同步 a.同步是指多个线程之间通过synchronize关键字这种方式来实现线程间的通讯。 b.这种方式本质上就是共享内存式的通讯。多个线程需要访问同一个共享变量,谁拿到了锁(获得了访问权限),谁就可以执行。 2.while轮询的方式 a.这种方式比较浪费资源,是因为JVM將调度器交给轮询线程执行时,它只是在不断地测试某个条件是否成立。 b.线程都是先把变量读取到本地线程栈空间,然后再去修改本地变量。另一线程每次都在取本地的条件变量,可能造成死循环。 3.wait/notify机制 a.调用wait()放弃CPU,并进入阻塞状态。调用notify(),唤醒其他线程。 b.这种方式的好处是CPU的利用率提高了。 4.管道通讯 使用java.io.PipedInputStream 和 java.io.PipedOutputStream进行通信。 分布式系统中说的两种通信机制:共享内存机制和消息通信机制。前面的synchronized关键字和while轮询 “属于” 共享内存机制, 由于是轮询的条件使用了volatile关键字修饰时,这就表示它们通过判断这个“共享的条件变量“是否改变了,来实现进程间的交流。 而管道通信,更像消息传递机制,也就是说:通过管道,将一个线程中的消息发送给另一个。 来源: CSDN 作者: jacljh 链接: https://blog.csdn

Java中的内存划分

耗尽温柔 提交于 2019-12-31 04:32:04
Java中的内存划分 Java程序在运行时,需要在内存中分配空间。为了提高运行效率,就对数据进行了不同的空间划分。因为每一片区域都有特定的数据处理方式和内存管理方式。 具体分为5种内存空间: 程序计数器:保证线程切换后能恢复到原来的执行位置。 虚拟机栈:(栈内存)为虚拟机执行java方法服务,方法被调用时,创建栈帧- 本地方法栈:为虚拟机执行使用到的Native方法服务 堆内存:存放所有new出来的东西 方法区:存储被虚拟机加载的类信息,常量,静态常量,静态方法等。 运行时常量池(方法区的一部分) GC对他们的回收: 内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条件的执行出栈和入栈的操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这个区域不需要过多的考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。 GC回收的主要对象:Java堆和方法区 一个接口中的多个实现类需要的内存可能不同,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC关注的也是这部分内存。 1.程序计数器:(线程私有) 每隔线程拥有一个程序计数器,在线程创建时创建,指向吓一跳指令的地址 执行本地方法时,其值为undefined。

Java中的内存划分

蹲街弑〆低调 提交于 2019-12-31 04:31:41
Java程序在运行时,需要在内存中分配空间。为了提高运行效率,就对数据进行了不同的空间划分。因为每一片区域都有特定的数据处理方式和内存管理方式。 具体分为5种内存空间: 程序计数器:保证线程切换后能恢复到原来的执行位置。 虚拟机栈:(栈内存)为虚拟机执行java方法服务,方法被调用时,创建栈帧- 本地方法栈:为虚拟机执行使用到的Native方法服务 堆内存:存放所有new出来的东西 方法区:存储被虚拟机加载的类信息,常量,静态常量,静态方法等。 运行时常量池(方法区的一部分) GC对他们的回收: 内存区域中的程序计数器、虚拟机栈、本地方法栈这3个区域随着线程而生,线程而灭;栈中的栈帧随着方法的进入和退出而有条件的执行出栈和入栈的操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的。在这个区域不需要过多的考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了。 GC回收的主要对象:Java堆和方法区 一个接口中的多个实现类需要的内存可能不同,一个方法中的多个分支需要的内存也可能不一样,我们只有在程序处于运行期间时才能知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC关注的也是这部分内存。 1.程序计数器:(线程私有) 每隔线程拥有一个程序计数器,在线程创建时创建,指向吓一跳指令的地址 执行本地方法时,其值为undefined。 说的通俗一点,我们知道

Java程序运行原理分析

北战南征 提交于 2019-12-30 23:33:18
1. JVM 简介 java源码被编译器成class字节码,然后由JVM运行的时候进行处理,下面一部分主要是JVM根据不同的操作系统进行的适配。 线程独占 :每个线程都会有它独立占据的空间,随线程生命周期而创建和销毁 线程贡献 :所有线程都能访问这块内存数据,随虚拟机或者GC创建和销毁 方法区 :用来存储加载的类的信息、常量、静态变量、编译后的代码等东西的。方法区在1.7以前把它叫做永久代,1.8之后叫做元数据空间。 虚拟机栈 :主要就是存储栈帧的,一个线程的执行会有一个或多个方法被执行,这个时候一个栈帧就对应一个方法。栈帧的内容包括: 局部变量表 操作数栈 动态链接 方法返回地址 附加信息等 栈内存默认大小为1M,如果超出会报StackOverflowError;(就像你写一个无限递归的方法,肯定会报这个错) 本地方法栈 :和虚拟机栈差不多,但是放的是本地方法(native修饰的),超出大小也会报StackOverflowError 程序计数器 :记录当前线程执行字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空。它在每个线程的私有空间中占有一部分空间,只是很小的一部分。它是因为CPU在同一时间只会执行一个线程,所以需要记录下当前执行的位置,使得激活的时候可以无缝衔接。 2. Class文件简介 class文件是一串二进制流,中间无任何分隔符

JVM——Java虚拟机架构

浪子不回头ぞ 提交于 2019-12-30 14:30:37
from https://blog.csdn.net/seu_calvin/article/details/51404589 0. 前言 Java虚拟机(Java virtualmachine)实现了 Java语言最重要的特征:即平台无关性。 平台无关性原理:编译后的 Java程序(.class文件)由 JVM 执行。JVM屏蔽了与具体平台相关的信息,使程序可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。因此实现Java平台无关性。 1. JVM结构图 JVM = 类加载器 classloader + 执行引擎 executionengine + 运行时数据区域 runtime data area 首先Java源代码文件被Java编译器编译为字节码文件,然后JVM 中的类加载器加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM 中的运行时数据区(内存)会用来存储程序执行期间需要用到的数据和相关信息。 因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。 2. ClassLoader Classloader把硬盘上的class文件加载到JVM 中的运行时数据区域,但是它不负责这个类文件能否执行,而这个是执行引擎负责的。 限于篇幅,类加载器的组织结构,加载类的机制原理等会在

JVM内存结构探秘及编码实战

Deadly 提交于 2019-12-30 10:02:11
了解JVM内存结构的目的 在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C、C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题。但是,正是由于把内存管理的权利交给了JVM,一旦出现内存泄漏和内存溢出方面的问题,如果不了解JVM是如何使用内存的,不了解JVM的内存结构是什么样子的,就很难找到问题的根源,就更难以解决问题。 欢迎关注微信公众号: 万猫学社 ,每周一分享Java技术干货。 JVM内存结构简介 在JVM所管理的内存中,大致分为以下几个运行时数据区域: 程序计数器:当前线程所执行的字节码的行号指示器。 虚拟机栈:Java方法执行的内存模型,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 本地方法栈:本地方法执行的内存模型,和虚拟机栈非常相似,其区别是本地方法栈为JVM使用到的Native方法服务。 堆:用于存储对象实例,是垃圾收集器管理的主要区域。 方法区:用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 其中,黄色区域的程序计数器、虚拟机栈和本地方法栈是线程私有的,红色区域的堆和方法区是线程共享的。下面我们逐一详细分析各个区域。 欢迎关注微信公众号: 万猫学社 ,每周一分享Java技术干货。 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间

EventBus 事件总线 案例

血红的双手。 提交于 2019-12-30 08:59:40
简介 地址:https://github.com/greenrobot/EventBusEventBus是一个【发布 / 订阅】的事件总线。简单点说,就是两人【约定】好怎么通信,一人发布消息,另外一个约定好的人立马接收到你发的消息。EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息。优点:开销小,代码更优雅,将发送者和接收者解耦。 用处:相信大家都用过【Handle】了进行线程通信,回调方法进行通信,是不是觉得特麻烦。EventBus就可以帮减少很多事,不管你在【任何地方】发布一个事件,接收者都能立马接收到你的消息,不用你考虑android【子线程操作UI线程】的问题! EvenBus简化了应用程序内【各组件间】、【组件与后台线程间】的通信。它的效果和Handler的效果大致相同,但是实现原理和使用方法是完全不同的,它是基于【保存】相应方法,然后通过【反射】机制来实现的。 包含4个成分:发布者,订阅者,事件,总线。 关系 :订阅者订阅事件到总线,发送者发布事件; 订阅者可以订阅多个事件,发送者可以发布任何事件,发布者同时也可以是订阅者。 注册订阅者: EventBus.getDefault().register(this);

Java面试官最爱问的volatile关键字

血红的双手。 提交于 2019-12-29 23:11:16
在Java的面试当中,面试官最爱问的就是volatile关键字相关的问题。经过多次面试之后,你是否思考过,为什么他们那么爱问volatile关键字相关的问题?而对于你,如果作为面试官,是否也会考虑采用volatile关键字作为切入点呢? 为什么爱问volatile关键字 爱问volatile关键字的面试官,大多数情况下都是有一定功底的,因为volatile作为切入点,往底层走可以切入Java内存模型(JMM),往并发方向走又可接切入Java并发编程,当然,再深入追究,JVM的底层操作、字节码的操作、单例都可以牵扯出来。 所以说懂的人提问题都是有门道的。那么,先整体来看看volatile关键字都设计到哪些点:内存可见性(JMM特性)、原子性(JMM特性)、禁止指令重排、线程并发、与synchronized的区别……再往深层次挖,可能就涉及到字节码、JVM等。 不过值得庆幸的是,如果你已经学习了微信公众号“程序新视界”JVM系列的文章,上面的知识点已经不是什么问题了,权当是复习了。那么,下面就以面试官提问的形式,在不看答案的情况下,尝试回答,看看学习效果如何。夺命连环问,开始…… 面试官:说说volatile关键字的特性 被volatile修饰的共享变量,就具有了以下两点特性: 保证了不同线程对该变量操作的内存可见性; 禁止指令重排序; 回答的很好,点出了volatile关键字两大特性

arthas使用介绍

岁酱吖の 提交于 2019-12-29 09:41:34
背景: 一次线上问题的综合排查排查,两个相同的系统的某个模块,数据量更少的系统查询更慢。 先说下整体思路: 查看系统整理负载,网络有100左右毫秒的延迟,看起来影响不大 查看正序运行整体情况,一次查询会经历3次FGC,有问题,解决后虽然会快一些但是还是有点慢 跟踪调用栈,发现有点在获查询结果的时候特别慢 排查是否有mysql慢查询(定义为1秒以上的查询),结果是没有 通过arthas发现调用了20多次查询,每次网络延迟100ms,加起来就有2s了,定位出问题。 这样看起来arthas真的很强大,它不仅仅能处理上述问题,还能.... 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 代码出现异常,怎么能获取请求参数和返回值。 Arthas到底是什么 Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,提供了丰富的功能,是排查jvm相关问题的利器。 在逛github时,发现了这款利器,深入了解之后,简直惊为天人。下面先列举一下它能做的一些事情:

arthas使用介绍

白昼怎懂夜的黑 提交于 2019-12-29 09:35:07
背景: 一次线上问题的综合排查排查,两个相同的系统的某个模块,数据量更少的系统查询更慢。 先说下整体思路: 查看系统整理负载,网络有100左右毫秒的延迟,看起来影响不大 查看正序运行整体情况,一次查询会经历3次FGC,有问题,解决后虽然会快一些但是还是有点慢 跟踪调用栈,发现有点在获查询结果的时候特别慢 排查是否有mysql慢查询(定义为1秒以上的查询),结果是没有 通过arthas发现调用了20多次查询,每次网络延迟100ms,加起来就有2s了,定位出问题。 这样看起来arthas真的很强大,它不仅仅能处理上述问题,还能.... 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 代码出现异常,怎么能获取请求参数和返回值。 Arthas到底是什么 Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,提供了丰富的功能,是排查jvm相关问题的利器。 在逛github时,发现了这款利器,深入了解之后,简直惊为天人。下面先列举一下它能做的一些事情: