本地线程

JVM内存模型

别说谁变了你拦得住时间么 提交于 2019-12-03 04:50:48
   JVM概述   JVM(Java Virtual Machine)就是Java虚拟机的简称,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。   引入Java虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。   Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。   Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。   Java虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库。    JVM内存模型      由上图可以看出

JAVA多线程面试题

↘锁芯ラ 提交于 2019-12-03 03:58:44
前言 多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是 所有的问题都会按照自己的理解回答一遍,不会去看网上的答案 ,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 40个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了

jmc使用说明

匿名 (未验证) 提交于 2019-12-03 00:38:01
实验JDK版本:jdk1.8.0_73 JMC:5.5(最新已经6.0了支持jdk9) JMC:Java Mission Control 伴随着5月份oracle的一份开源声明―- JMC Open Sourced JMC又一次备受关注。 JMC是源自JRockit JVM的一套监控和管理工具,Oracle在发布JAVA 7u4(Java 7 Update 40)时将其包含在JDK中,用户不再需要单独下载。 使用 JMC可以监视和管理 Java 应用程序,不会导致相关工具类的大幅度性能开销,它使用为 Java 虚拟机 (JVM) 的普通自适应动态优化收集的数据。 主要部分 JVM浏览器:显示了正在运行的 Java 应用程序及其 JVM,每个JVM实例称为一个JVM连接。JVM浏览器允许用户列出并连接到本地和远程运行的 Java 应用。它能够使用 Java 发现协议(JDP)自动地发现本地和远程运行的 Java 进程。 JMX 控制台:能够通过 JMX 接口管理并监控 JDK ,实时收集并显示其特征。它提供了实时集合、堆使用情况、CPU 负载以及其他通过 MBeans 暴露的和在 MBean 服务器中注册的信息,并可通过托管 Bean (MBean) 更改一些运行时属性。还可以创建在特定事件上触发的规则 (例如,如果应用程序的 CPU 占用率达到了 90%,则发送电子邮件)。 JFR

jmc使用说明

匿名 (未验证) 提交于 2019-12-03 00:37:01
实验JDK版本:jdk1.8.0_73 JMC:5.5(最新已经6.0了支持jdk9) JMC:Java Mission Control 伴随着5月份oracle的一份开源声明―- JMC Open Sourced JMC又一次备受关注。 JMC是源自JRockit JVM的一套监控和管理工具,Oracle在发布JAVA 7u4(Java 7 Update 40)时将其包含在JDK中,用户不再需要单独下载。 使用 JMC可以监视和管理 Java 应用程序,不会导致相关工具类的大幅度性能开销,它使用为 Java 虚拟机 (JVM) 的普通自适应动态优化收集的数据。 主要部分 JVM浏览器:显示了正在运行的 Java 应用程序及其 JVM,每个JVM实例称为一个JVM连接。JVM浏览器允许用户列出并连接到本地和远程运行的 Java 应用。它能够使用 Java 发现协议(JDP)自动地发现本地和远程运行的 Java 进程。 JMX 控制台:能够通过 JMX 接口管理并监控 JDK ,实时收集并显示其特征。它提供了实时集合、堆使用情况、CPU 负载以及其他通过 MBeans 暴露的和在 MBean 服务器中注册的信息,并可通过托管 Bean (MBean) 更改一些运行时属性。还可以创建在特定事件上触发的规则 (例如,如果应用程序的 CPU 占用率达到了 90%,则发送电子邮件)。 JFR

key words

匿名 (未验证) 提交于 2019-12-03 00:37:01
计算机术语 2018年6月19日 11:30 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。 来自 https://baike.baidu.com/item/%E5%BF%83%E8%B7%B3%E6%9C%BA%E5%88%B6/2817701?fr=aladdin 纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。纠删码会创建一个数学函数来描述一组数字,这样就可以检查它们的准确性,而且一旦其中一个数字丢失,还可以恢复。 来自 https://baike.baidu.com/item/%E7%BA%A0%E5%88%A0%E7%A0%81/5310217 进程,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。它的执行需要系统分配资源创建实体之后,才能进行。 线程的特点就是在不需要独立资源的情况下就可以运行。如此一来会极大节省资源开销,以及处理时间。 无论是进程还是线程,对于程序员而言,都是用来实现多任务并发的技术手段。 其实,也没有人写出只有线程而没有进程的程序。多线程程序中至少有一个主线程,而这个主线程其实就是有main函数的进程。它是整个程序的进程

JVM学习――内存区域及异常

匿名 (未验证) 提交于 2019-12-03 00:37:01
JVM 自动内存管理机制包括内存动态分配和垃圾自动收集两部分,可能出现的内存异常包括 内存泄漏 和 内存溢出 两种。 内存泄漏 :已申请的内存空间无法被主动释放或及时回收,导致可用内存越来越少,最终造成内存溢出。 内存溢出 :空闲内存不足,无法分配新内存给程序,产生原因包括内存短缺(硬件、系统和虚拟机层面的内存限制)、内存需求过大(深度递归、大规模数据库读取)、内存泄漏等。 硬件级内存限制:物理内存与交换区空间总和。 系统级内存限制:处理器/操作系统位数限制内存寻址空间,32位操作系统寻址空间为2GB。 虚拟机级内存限制: -Xms 、 -Xmx 等参数设置 JVM 各内存区域大小。 内存区域 属性 数据结构 存储内容 抛出异常类型 垃圾收集 程序计数器 线程私有 无 正在执行的字节码行号 无(唯一无异常抛出) 无 Java 虚拟机栈 线程私有 ջ Java 方法栈帧 StackOverflowError / OutOfMemoryError 无 本地方法栈 线程私有 ջ Native 方法栈帧 StackOverflowError / OutOfMemoryError 无 Java 堆 线程共享 堆 对象实例 / 数组 OutOfMemoryError 有 方法区 线程共享 堆 类信息 / 常量 / 静态变量/ 即时编译代码 OutOfMemoryError 有 Java

Android面试题整理1

匿名 (未验证) 提交于 2019-12-03 00:36:02
1. 接口的意义(百度) 接口的意义用三个词概括规范,扩展,回调。 2. 抽象类的意义(百度) 为其他子类提供一个公共的类型 封装子类中重复定义的内容 定义抽象方法,子类虽然有不同的实现,但是定义是一致的。 3. 内部类的作用 内部类提供了更好的封装,可以把内部类以藏在外部类之内,不允许同一个包中的其他类访问该类。 内部类的方法可以直接访问外部类的所有数据,包括私有数据。 内部类所实现的功能使用外部同样可以实现,只是使用内部类更方便。 内部类的功能在于,每个内部类都能独立的继承一个接口的实现,所以无论外围类是否已经继承了某个(接口的)的实现,对于内部类都没有影响。内部类使得多重继承的解决方案变得完整,并且内部类允许继承多个非接口类型(类或者抽象类)。通过内部类分别继承一个基类,外部类创建内部类的对象,并使用内部类的方法,变相的实现类多重继承。 4. Java内部类的好处?为什么用内部类? 举个例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。 真正原因是解决多继承 5.静态内部类的非静态内部类的区别 和非静态内部类相比,区别就在于静态内部类没有了只指向外部的引用。 在任何非静态内部类中

JVM参数调优

匿名 (未验证) 提交于 2019-12-03 00:27:02
基本常识 堆内存 = Eden + old + Metaspace(perm) 总内存 = 堆 + 栈 + 堆外内存 + jvm等内部使用的内存 system.gc最常见的场景是RMI/NIO下的堆外内存分配等 java -verbose:class -version:查看jvm启动时被加载的类 OutOfMemoryError 分配内存当Eden内存不够用的时候,某些情况下会尝试到Old里进行分配(比如说要分配的内存很大),如果还是没有分配成功,于是会触发一次ygc的动作,而ygc完成之后我们会再次尝试分配,如果仍不足以分配此时的内存,那会接着做一次full gc(不过此时的soft reference不会被强制回收),将老生代也回收一下,接着再做一次分配,仍然不够分配那会做一次强制将soft reference也回收的full gc,如果还是不能分配,那这个时候就抛出OutOfMemoryError perm用来存klass、method、constantPool等信息,klass是我们熟知的class文件在jvm里的运行时数据结构 内存相关(常用) -Xms:设置程序启动时的初始堆大小(如 -Xms4g,jvm启动时,分配最小堆大小4g) -Xmx:设置程序能获得的最大堆大小(如 -Xmx4g,jvm启动时,允许分配的最大的堆大小4g。一般设定为同一个值

解Bug之路:记一次JVM堆外内存泄露Bug的查找

匿名 (未验证) 提交于 2019-12-03 00:19:01
行业前列 百家号 01-15 16:30 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。 由于物理内存定量分析部分用到了linux kernel虚拟内存管理的知识,读者如果有兴趣了解请看ulk3(《深入理解linux内核第三版》) 内存泄露Bug现场 一个线上稳定运行了三年的系统,从物理机迁移到docker环境后,运行了一段时间,突然被监控系统发出了某些实例不可用的报警。所幸有负载均衡,可以自动下掉节点,如下图所示: 登录到对应机器上后,发现由于内存占用太大,触发OOM,然后被linux系统本身给kill了。 应急措施 紧急在出问题的实例上再次启动应用,启动后,内存占用正常,一切Okay。 奇怪现象 当前设置的最大堆内存是1792M,如下所示: -Xmx1792m -Xms1792m -Xmn900m -XX:PermSize=256m -XX:MaxPermSize=256m -server -Xss512k 查看操作系统层面的监控,发现内存占用情况如下图所示: 上图蓝色的线表示总的内存使用量,发现一直涨到了4G后,超出了系统限制。 很明显,有堆外内存泄露了。 查找线索 gc日志 一般出现内存泄露,笔者立马想到的就是查看当时的gc日志。

并发编程之线程共享和协作(一)

匿名 (未验证) 提交于 2019-12-03 00:17:01
更多Android架构进阶视频学习请点击: https://space.bilibili.com/474380680 本篇文章将从以下几个内容来阐述线程共享和协作: [基础概念之CPU核心数、线程数,时间片轮转机制解读] [线程之间的共享] [线程间的协作] 一、基础概念 CPU核心数、线程数 两者的关系:cpu的核心数与线程数是1:1的关系,例如一个8核的cpu,支持8个线程同时运行。但在intel引入超线程技术以后,cpu与线程数的关系就变成了1:2。此外在开发过程中并没感觉到线程的限制,那是因为cpu时间片轮转机制(RR调度)的算法的作用。什么是cpu时间片轮转机制看下面1.2. CPU时间片轮转机制 含义就是:cpu给每个进程分配一个“时间段”,这个时间段就叫做这个进程的“时间片”,这个时间片就是这个进程允许运行的时间,如果当这个进程的时间片段结束,操作系统就会把分配给这个进程的cpu剥夺,分配给另外一个进程。如果进程在时间片还没结束的情况下阻塞了,或者说进程跑完了,cpu就会进行切换。cpu在两个进程之间的切换称为“上下文切换”,上下文切换是需要时间的,大约需要花费5000~20000(5毫秒到20毫秒,这个花费的时间是由操作系统决定)个时钟周期,尽管我们平时感觉不到。所以在开发过程中要注意上下文切换(两个进程之间的切换)对我们程序性能的影响。 二、 线程之间的共享