本地线程

JVM的内存区域划分(jdk7和jdk8)

丶灬走出姿态 提交于 2019-12-13 19:59:15
前言 1、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 2、JRE/JDK/JVM是什么关系 JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。 JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。 JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。 3、JVM执行程序的过程

Unix / Linux 线程的实质

天涯浪子 提交于 2019-12-13 01:15:49
Unix / Linux 线程的实质 线程与进程的比较 概述: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行. 相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。 在串行程序基础上引入线程和进程是为了提高程序的并发度,从而提高程序运行效率和响应时间。 区别: 进 程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个 进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序 健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。 简而言之,一个程序至少有一个进程,一个进程至少有一个线程

多线程并发神器--ThreadLocal

∥☆過路亽.° 提交于 2019-12-12 06:07:11
什么是ThreadLocal 可以理解成线程本地变量,传统的线程对一个变量操作时操作的是同一个对象,也存在线程安全的问题。 ThreadLocal是一个变量的本地副本,线程对变量的操作不会影响其他线程。 首先看看ThreadLocal的类结构 其中可重写的方法有以下几个 initialValue():ThreadLocal初始化的值,新建ThreadLocal的一般要重写给个初始的值。 get():获取当前线程变量的副本值。 set(T value):设置、更新当前线程上的变量副本值。 remove():移除当前线程上的变量副本。 ThreadLocal使用 新建ThreadLocal,类型为User,并初始化为tom,12岁,启动3个线程,每个线程循环3次,休眠1少,主线程再输出。 输出结果如下 从结果可见每个线程使用的是各自线程的变量副本,并没有影响其他线程和主线程,实现了线程隔离的效果。 使用场景 一般用来解决数据库连接、用户session管理等。 内存泄露问题 如果线程的执行周期过长可能导致内存泄露的风险,虽然线程执行完后会ThreadLocal也会随着销毁,但最好使用完后加上remove这样会加快内存的释放,一般来说线程周期不长是不太会引起内存泄露的。还有如果定义了ThreadLocal又不用也有问题,因为每次ThreadLocal的get/set

Java 基础:JVM虚拟机结构

荒凉一梦 提交于 2019-12-11 23:06:57
一、JVM结构 1.Class Loader:依据特定格式,加载class文件到内存 2.Execution Engine:对加载的二进制字节码命令进行解析 3.Native Interface:融合不同开发语言的原生库为Java所用 4.Runtime Data Area:JVM内存空间结构模型 二、JVM内存空间结构模型 1.内存模型结构 (1) 线程私有 程序计数器(字节码指令)、虚拟机栈(java方法)、本地方法栈(native方法) (2) 线程共享 MetaSpace、Java堆 2. 线程私有:程序计数器(Program Counter Register) 作用: (1)线程独立拥有计数器,是当前线程所执行的字节码行号指示器(逻辑) (2)改变计数器的值来选取当前线程需要执行的下一条字节码指令 (3)线程独有,即一个线程拥有一个计数器 (4)对Java方法计数,如果是Native方法则计数器值为Undefined (5)不会发生内存泄漏 3. 线程私有:Java虚拟机栈 (1)作用:java方法执行的内存模型,包含多个栈帧 (2)程序执行过程:对于当前线程,每个方法会产生1个栈帧,当方法执行结束后,该栈帧取消。而每个栈帧中包含:局部变量表、操作栈、动态链接、返回地址等等。 (3) 当前栈中包含内容 局部变量表:包含了执行过程中的所有变量(boolen,char

【多线程】如何保证线程安全

若如初见. 提交于 2019-12-11 13:29:04
一、线程安全等级 之前的博客 中已有所提及“线程安全”问题,一般我们常说某某类是线程安全的,某某是非线程安全的。其实线程安全并不是一个“非黑即白”单项选择题。按照“线程安全”的安全程度 由强到弱 来排序,我们可以将java语言中各种操作共享的数据分为以下5类: 不可变、绝对线程安全、相对线程安全、线程兼容和线程对立 。 1、不可变 在java语言中,不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再采取任何的线程安全保障措施。如final关键字修饰的数据不可修改,可靠性最高。 2、绝对线程安全 绝对的线程安全完全满足Brian GoetZ给出的线程安全的定义,这个定义其实是很严格的,一个类要达到“不管运行时环境如何,调用者都不需要任何额外的同步措施”通常需要付出很大的代价。 3、相对线程安全 相对线程安全就是我们通常意义上所讲的一个类是“线程安全”的。 它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。 在java语言中,大部分的线程安全类都属于相对线程安全的,例如Vector、HashTable、Collections的synchronizedCollection()方法保证的集合。 4、线程兼容

Java 中熟悉而又陌生的 ThreadLocal

≡放荡痞女 提交于 2019-12-10 20:43:39
ThreadLocal 是什么? 要学习一个新东西至少要知道它是什么?这点应该是确定的。那么 ThreadLocal 到底是什么呢?其实Thread(线程)、Local(本地)这两个单词都不算太难,在平时也是屡见不鲜,ThreadLocal 很容易让人望文生义,想当然地认为是一个“本地线程”。其实 ThreadLocal 并不是一个 Thread,而是 Thread 的局部变量。那么它的作用到底是什么?先来看看JDK(13)文档的解释: This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

并发(JMM综述)

核能气质少年 提交于 2019-12-10 15:31:41
JMM综述 文章目录 JMM综述 一,内存模型产生背景 二,内存模型概念 2.1JMM组成部分 2.2JVM内存操作的并发问题 2.3内存交互操作流程 三,JMM深入 3.1原子性,可见性和有序性 3.2happens-before 3.3内存屏障 3.3重排序 四,volatile 4.1volatile内存语义 4.2volatile特性 4.3volatile如何禁止指令重排序 五,synchronize 六,final 一,内存模型产生背景 由于计算机的存储设备与处理器的运算速度有几个数量级的差距,为了避免处理器等待缓慢的内存读写操作完成,现代计算机系统通过加入一层读写速度尽可能无限接近处理器运算速度的高速缓存 缓存作为内存和cpu之间的缓冲区,将运算需要用到的数据放入到高速缓存中,让运算能快速运行,运算结束后在从缓存同步回内存之中 类似redis缓存和数据库一样,引入了高速缓存虽然解决了处理器和内存速度的差异,但是却带来一个新的问题-----缓存一致性问题 在多核处理器的系统中,每个处理器都有自己的高速缓存,他们共享同一内存,当多个处理器的运算任务都涉及同一块内存区域时,可能会出现缓存数据不一致的问题,需要使用缓存一致性协议来维护缓存的一致性 二,内存模型概念 java虚拟机提供java内存模型(JMM)来 屏蔽掉各种硬件和操作系统的内存访问差异 ,以实现

ThreadLocal

ε祈祈猫儿з 提交于 2019-12-10 13:35:40
一、概述 ThreadLocal是什么? 其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,惹事ThreadLocalvariable(线程局部变量)。线程局部变量(ThreadLocal)其实功能非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是java中一种较为特殊的线程绑定机制,使每一个线程都可以独立的改变自己的副本,而不会和其他线程的副本冲突。 从线程角度看,每个线程都保持一个对其线程局部变量的隐式引用,只要线程是活动的并且ThreadLocal实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。 通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发问题提供了一种隔离机制。 概况起来说,对于多线程资源共享的问题,同步机制采用了"以时间换空间"的方式,而ThreadLocal采用了"以空间换时间"的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。 二、API说明 ThreadLocal():创建一个线程本地变量。 protected T initialValue():返回此线程局部变量的当前线程的初始值

学习-JVM命令

谁说胖子不能爱 提交于 2019-12-10 12:22:19
jstat jstat (JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。 格式: jstat [option] LVMID [interval] [count] 参数: [option] : 操作参数 class : class loader的行为统计 compiler : HotSpt JIT编译器行为统计 gc : 垃圾回收堆的行为统计 gccapacity : 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计 gcutil : 垃圾回收统计概述 gccause : 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因 gcnew : 新生代行为统计 gcnewcapacity : 新生代与其相应的内存空间的统计 gcold : 年老代和永生代行为统计 gcoldcapacity : 年老代行为统计 gcpermcapacity : 永生代行为统计 printcompilation : HotSpot编译方法统计 LVMID : 本地虚拟机进程ID [interval] : 连续输出的时间间隔 [count] : 连续输出的次数 option 参数详解 -class 监视类装载、卸载数量、总空间以及耗费的时间 $ jstat

JVM内存模型

笑着哭i 提交于 2019-12-10 08:01:11
JVM内存结构 程序计数寄存器(Program Counter Register) 每个线程在创建后,都会产生自己的程序计数器和栈帧,程序计数器用来存放执行指令的 偏移量 和 字节码行号指示器 等,线程执行或恢复都要依赖程序计数器。程序计数器在各个线程之间互不影响,此区域也不会发生内存溢出异常。 在多线程中,就会存在线程上下文切换执行,为了线程切换后能恢复正确的执行位置,所以需要从程序计数器中获取该线程需要执行的字节码的偏移地址(偏移地址:执行javap命令后**数字:**中的数字)。 如果执行java方法则程序计数器记录的是正在执行的虚拟机字节码指令的地址。如果执行Native方法,程序计数器则为空。 由于是线程私有的,生命周期随着线程,线程启动而产生,线程结束而消亡。 Java 虚拟机规范里面, 唯一 一个没有规定任何 OutOfMemoryError 情况的区域,由于保存的是线程需要执行的字节码的偏移地址,当执行下一条指令的时候,改变的只是程序计数器中保存的地址,并不需要申请新的内存来保存新的指令地址,因此,不会产生内存溢出。 Java虚拟机栈 特点 JVM中的虚拟机栈是描述Java方法执行的内存区域,它是线程私有的。 线程启动时会创建虚拟机栈,每个方法在执行时会在虚拟机栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法返回地址、附加信息等信息