本地线程

【JAVA 虚拟机的内存模型】

寵の児 提交于 2019-12-10 07:45:45
1.这个话题其实被很多人写过了,但是也会被很多人继续写下去,我就是其中一个。 2.JVM的内存划分其实并不是一样的,因为每个虚拟机,每个版本都会有一定的改动。本文讨论的是HotSpot虚拟机的内存模型(JAVA虚拟机的一个版本)。 以上就是JVM的内存结构。 一个一个来说。 首先提两个概念:线程私有和线程共享。这个指的是在多线程的环境下,如果一个线程的某些资源只能是自己访问,其他线程不可访问,那么就是线程私有,相反,如果所有线程共享某份资源就是线程共享。 (1)程序计数器,(Program Counter Register)。这个在机组里面其实有很到位的解释,当然了这里其实和机组里面的是差不多的。因为JVM主要是解释字节码的,所以这个计数器的作用就是标识当前线程解释到了哪一行字节码,通过改变这个计数器的值来让程序不断地执行。这块内存肯定是线程私有的,因为每个线程解释到的位置是不尽相同的,所以这个具有线程的特殊性,必须线程私有。 (2)JAVA虚拟机栈(JAVA Virtual Machine Stacks)。虚拟机栈其实是描述JAVA方法执行的内存模型,这个很好理解,比如当前线程里面有很多函数执行,那么这些函数需要压栈,出栈等。这些操作都是在这个虚拟机栈里完成的。这个也是线程私有的。 (3)本地方法栈。(Native Method Stack)。这个其实是为了本地方法而设置的栈

Java基础知识——JVM基础

非 Y 不嫁゛ 提交于 2019-12-10 01:31:09
JVM基础 jvm:运行在操作系统上的假想的计算机 1:Java文件的编译和解释 2:Java线程 3:JVM组成 4:GC回收算法 5:Java引用 6:GC垃圾收集器 7:Java IO/NIO 8:类加载 执行过程 Java源文件——编译器javac——class文件(字节码文件,二进制文件) 字节码文件——解释器(jvm)java——机器码文件 每一台平台解释器不同,但是虚拟机相同,跨平台的原因。 一个程序对应一个虚拟机,多个程序对应多个虚拟机, 虚拟机之间数据不共享 什么是平台:操作系统及其硬件环境。跨平台即代码的运行不依赖于操作系统及其硬件环境。 c语言不是跨平台的,因为不同操作系统下的编译器编译代码得到不同文件,不能在其他操作系统上运行。即由Windows编译器得到的exe文件不能在Linux上运行 Java跨平台:因为编译后都得到class文件,可以在不同的操作系统上的解释器上执行。 并且注意: 不同的系统下有不同的JVM,所以JVM不是跨平台 JAVA依赖于JVM,JVM给JAVA提供了运行环境,所以JAVA是跨平台的。 程序执行的方式: 第一是编译执行:C它把源程序由特定平台的编译器一次性编译为平台相关的机器码,优点是执行速度快,缺点是无法跨平台; 第二是解释执行,如HTML,JavaScript,它使用特定的解释器,把代码一行行解释为机器码,类似于同声翻译

进程通信和同步(转)

ぃ、小莉子 提交于 2019-12-09 21:24:53
概念 竞争条件 多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时许,称为竞争条件。 忙等待的互斥 几种实现互斥的方案: 屏蔽中断 1在单处理器系统中,最简单的方法是使每个进程在刚刚进入临界区后立即屏蔽所有中断,包括时钟中断。CPU 只有在发生中断的时候才会进行进程切换,这样在中断被屏蔽后 CPU 将不会被切换到其他进程。 锁变量 严格轮换法 while (TRUE) { while (turn != 0) critical_region(); turn = 1; noncritical_region(); } while (TRUE) { while (turn != 1) critical_region(); turn = 0; noncritical_region(); } 忙等待检查变量。使用忙等待的锁称为自旋锁。 Peterson 解法 #define FALSE 0 #define TRUE 1 #define N 2 /* number of processes */ int turn; /* whose turn is it? */ int interested[N]; /* all values initially 0 (FALSE) */ void enter_region(int process); /* process is 0 or 1 */ {

详解JVM内存模型与JVM参数详细配置

回眸只為那壹抹淺笑 提交于 2019-12-09 17:15:48
对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 JVM内存结构 由上图可以清楚的看到JVM的内存空间分为3大部分: 堆内存 方法区 栈内存 其中栈内存可以再细分为java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代,新生代中还可以再次划分为Eden区、From Survivor区和To Survivor区。 其中一部分是线程共享的,包括 Java 堆和方法区;另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存。 堆内存(Heap) 对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。 下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代已经被移除。 新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ) 默认的,Eden : from : to = 8 : 1 : 1

深入学习Java虚拟机(三)

微笑、不失礼 提交于 2019-12-09 17:10:08
Hotspot是如何发起内存回收的? 1:枚举根节点 以从 GC Root 节点找引用链操作为例。 若在全局性的引用(常量、静态类属性)与执行上下文(栈帧中本地变量表)中查找引用链,由于现在很多应用仅仅方法区就有数百兆,如果逐个检查,必然会消耗很多时间。 可达性分析对执行时间的敏感还体现在 GC停顿 上,因为分析工作必须在一个能够 确保一致性的快照中进行 。这里的 一致性 是指在 整个分析期间整个执行系统看起来就像被冻结在某个时间点上,不可出现分析过程中对象引用关系不断变化的情况 。这一点导致GC进行时必须 停顿所有Java执行线程 。( stop the word ) 主流的Java虚拟机使用的都是 准确式GC 。所以当执行系统停顿下来后,并不需要一个不漏的检查完所有执行上下文和全局引用的位置, 虚拟机是有办法直接得知哪些地方存在对象引用 。在Hotspot中,是使用一组 OopMap 的数据结构来达到这个目的的。 在 类加载完成后 ,HotSpot就把对象内什么偏移量上是什么数据计算出来,在 编译过程中 ,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样GC在扫描的时候就可以直接得知这些信息。 2:安全点 在OopMap的帮助下,HotSpot可以快速的完成GC Roots 枚举,但是如果每一条指令都生成对应的OopMap,将需要大量的额外空间,GC的空间成本会变得很高。

JVM(2) JVM内存模型

丶灬走出姿态 提交于 2019-12-09 11:50:23
一、概述 Java的内存管理采用[自动内存管理]机制,因为这个自动管理机制,Java程序员就不需要去写释放内存的代码,而且不容易出现内存泄漏问题(比C/C++程序员少一些烦恼)。但是由于内存的申请和释放都交给了Java虚拟机,一旦出现内存泄漏和溢出问题时,在不了解Java虚拟机内存结构和自动管理机制的情况下,就很难排查问题的所在。所以如果想要成为一个优秀的程序员或者进阶为一个牛逼的架构师,掌握Java虚拟机的自动内存管理机制那是必须的。 二、JVM运行时数据区域 根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时的数据区域:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。 如图所示: 注:上图的虚拟机运行时数据区是Java虚拟机规范所规定的区域,不同的虚拟机有不同的实现。 上面图片有线程共享和线程隔离的区域,下面在通过一张图片来进行简单说明,让你更加清晰的理解什么是线程共享和什么是线程隔离 通过上面的两个图,大概对JVM的内存模型有个初步的认识,下面我们在看一下具体的每一个区域到底是什么东东。 1 、程序计数器 程序计数器(Program Counter Register

Java锁----Lock实现原理

末鹿安然 提交于 2019-12-09 10:59:53
转载。 https://blog.csdn.net/wl6965307/article/details/51249156 Lock完全用 Java 写成,在java这个层面是无关JVM实现的。 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异,因此我们以ReentrantLock作为讲解切入点。 1. ReentrantLock的调用过程 经过观察ReentrantLock把所有Lock接口的操作都委派到一个Sync类上,该类继承了AbstractQueuedSynchronizer: [java] view plain copy static abstract class Sync extends AbstractQueuedSynchronizer Sync又有两个子类: [java] view plain copy final static class NonfairSync extends Sync [java] view plain copy final static class FairSync

从hadoop框架与MapReduce模式中谈海量数据处理

邮差的信 提交于 2019-12-08 18:20:07
废话不说直接来一张图如下: 从JVM的角度看Map和Reduce Map阶段包括: 第一读数据:从HDFS读取数据 1、问题:读取数据产生多少个Mapper?? Mapper数据过大的话,会产生大量的小文件,由于Mapper是基于虚拟机的,过多的Mapper创建和初始化及关闭虚拟机都会消耗大量的硬件资源; Mapper数太小,并发度过小,Job执行时间过长,无法充分利用分布式硬件资源; 2 、 Mapper 数量由什么决定?? ( 1 ) 输入文件数目 ( 2 ) 输入文件的大小 ( 3 ) 配置参数 这三个因素决定的。 涉及参数: mapreduce.input.fileinputformat.split.minsize //启动map最小的split size大小,默认0 mapreduce.input.fileinputformat.split.maxsize //启动map最大的split size大小,默认256M dfs.block.size//block块大小,默认64M 计算公式:splitSize = Math.max(minSize, Math.min(maxSize, blockSize)); 例如 默认情况下:例如一个文件800M,Block大小是128M,那么Mapper数目就是7个。6个Mapper处理的数据是128M,1个Mapper处理的数据是32M

VisualVM分析与HelloWorld、springBoot项目

空扰寡人 提交于 2019-12-08 01:59:26
VisualVM分析与HelloWorld、springBoot项目 自从1995年第一个JDK版本JDKBeta发布,至今已经快25年,这些年来Java的框架日新月异,从最开始的Servlet阶段,到SSH,SSI,SSM,springboot等,还有一些其他方向的框架微服务SpringCloud、响应式编程Spring Reactor。零零总总 的框架,我们都需要去熟悉,那么怎么去快速熟悉呢,我觉得可以看源码,可以看博客,也可以根据内存分配去完善理解。 那么问题来了,一个Java项目在咱们平时启动项目的时候,究竟发生了什么,创建几个简单的项目,用VisualVM来分析一下~ Main 简单的项目,应该没有比HelloWorld更简单的了吧,按照老规矩,咱们就从HelloWorld开始分析!那么简单的项目大家都能闭着眼睛敲出来,是不是没分析的必要啊,别着急,写好HelloWorld咱们开始分析: System.out.println("HelloWorld start"); // 这里让线程睡一会,方便分析 Thread.sleep(100000); System.out.println("HelloWorld end"); 运行main方法,打开VisualVM,发现事情并不简单哦,这个简单的项目有十六个线程维护,其中守护线程有十五个。 其中几大线程的内存分配情况如下:

JVM

自闭症网瘾萝莉.ら 提交于 2019-12-07 21:43:16
一、JVM一些基本概念 1、JVM和普通虚拟机 JVM:Java Virtual Machine,程序自己独立的运行环境;堆栈、寄存器、字节码指令;可以运行多种语言:Java、Scala、Grovvy; 普通虚拟机:能完整提供虚拟主机的PC,必须安装操作系统,以CPU指令运行。例如VMWare、Visual Box 2、JVM/JDK/JRE关系 JVM :(Java Virtual Machine),只认识 class文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心。 JRE :(Java Runtime Environment),Java 运行时环境。它主要包含 jvm 的标准实现和 Java 的一些基本类库。JRE = JVM + Java 类库。 JDK :(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。 显然,这三者的关系是:一层层的嵌套关系 JDK>JRE>JVM 3、JVM产品有哪些 HotSpot、Jrockit、J9 4、为什么会出现JVM Java程序编译后的文件是*.class文件,*