本地线程

JVM运行时内存结构

时间秒杀一切 提交于 2019-12-02 20:09:54
JVM运行时内存结构 JVM内存模型 JVM运行时内存=共享内存区+线程内存区 共享内存区 共享内存区=持久代+堆 持久代=方法区+其他 堆=Old Space+Young Space Young Space=Eden+S0+S1 持久代 JVM用持久代(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。 可通过-XX:PermSize和-XX:MaxPermSize来指定持久代初始化值和最大值。 Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。 堆 堆,主要用来存放类的对象实例信息。 堆分为Old Space(又名,Tenured Generation)和Young Space。 Old Space主要存放应用程序中生命周期长的存活对象; Eden(伊甸园)主要存放新生的对象; S0和S1是两个大小相同的内存区域,主要存放每次垃圾回收后Eden存活的对象,作为对象从Eden过渡到Old Space的缓冲地带(S是指英文单词Survivor Space)。 堆之所以要划分区间,是为了方便对象创建和垃圾回收,后面垃圾回收部分会解释 线程内存区 线程内存区=单个线程内存+单个线程内存+.....

多线程基础

我怕爱的太早我们不能终老 提交于 2019-12-02 19:54:46
并发编程基础: 线程状态(NEW、RUNNABLE、BLOCKED、WAITING、TIME_WAITING、TERMINATED) NEW:初始状态,线程被构建,但是还没有调用 start 方法 RUNNABLED:运行状态,JAVA 线程把操作系统中的就绪和运行两种状态统一 称为“运行中” BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃 了 CPU 使用权,阻塞也分为几种情况 等待阻塞:运行的线程执行 wait 方法,jvm 会把当前线程放入到等待队列 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其他线程锁占 用了,那么 jvm 会把当前的线程放入到锁池中 其他阻塞:运行的线程执行 Thread.sleep 或者 t.join 方法,或者发出了 I/O 请求时,JVM 会把当前线程设置为阻塞状态,当 sleep 结束、join 线程终止、 io 处理完毕则线程恢复 TIME_WAITING:超时等待状态,超时以后自动返回 TERMINATED:终止状态,表示当前线程执行完毕 线程状态调用关系图: 跟踪线程: 打开终端或者命令提示符,键入“jps”,(JDK1.5 提供的一个显示当前所有 java 进程 pid 的命令),可以获得相应进程的 pid 根据上一步骤获得的 pid,继续输入 jstack pid(jstack 是 java

简单认识JVM

≡放荡痞女 提交于 2019-12-02 19:39:25
准备:   在具体聊JVM之前,我们先看两张图,通过分析图,咱们慢慢来聊聊JVM。 JVM内存结构图 JVM内存结构脑图   上面两张图中,第二张图相对来说比较直观,就是JVM内存结构都划分成了哪些模块,各个模块各有什么特点。其实这些我们都可以在第一张图中,找到答案,不着急咱们先慢慢的一点点的分析一下第一张图。     我们先来看一下JVM整体的体系结构。 JVM体系结构:    类加载器(ClassLoader): 负责加载.class文件。我们编译期通过javac将.java文件编译成.class文件。在程序运行的时候则就是根据.class文件特有的标示,由类装载器(ClassLoader)来加载.class文件。加载成功后,至于它是否可以运行,就要交给后面的执行引擎(ExecutionEngine)来判断了。    运行时数据区: 这也是我们今天主要分析的部分,也就是JVM的内存结构。它主要分为 方法区、堆、Java栈、程序计数器、本地方法栈 五个部分。    执行引擎: 上面我们说一个.class文件是否可以运行,要看执行引擎,很显然执行引擎负责的最主要的工作就是执行字节码(即.class文件)以及本地方法。      接下来,我想和大家再说说JVM整体工作的流程,或者说JVM从创建到消亡都经历了什么。 JVM工作流程:   我们知道JVM主要的工作就是将编译成

工具类-线程池

放肆的年华 提交于 2019-12-02 19:19:20
线程池的基本类(默认是单例的否则线程无法得到控制) public class ThreadManager { public static ThreadPool instance; private ThreadPoolExecutor longExecutor; // 耗时比较长的线程池 用来请求网络 private ThreadPoolExecutor shortExecutor; // 比较短的线程池 用来加载本地数据 // 获取单例的线程池对象 public static ThreadPool getInstance () { if (instance == null ) { synchronized (ThreadManager.class) { if (instance == null ) { int cpuNum = Runtime.getRuntime().availableProcessors(); // 获取处理器数量 int threadNum = cpuNum * 2 + 1 ; // 根据cpu数量,计算出合理的线程并发数 instance = new ThreadPool(threadNum- 1 , threadNum, Integer.MAX_VALUE); //默认是双核的cpu 每个核心走一个线程 一个等待线程 } } } return

创建线程的四种方法

扶醉桌前 提交于 2019-12-02 18:45:06
Java多线程创建(不管怎样,启动线程调用start()) 一.继承Thread实现多线程, 而后覆写run()[run方法为线程类核心方法]相当于主线程main(),相当于入口 a.一个线程调用两次start(),抛出状态异常。 即一个线程的start()方法只能调用一次 b.native声明的方法,没有方法体,只有声明,但本地方法不是抽象方法, 而是Java调用C语言方法(JNI平台) registerNatives方法包含所有与线程相关的操作系统方法 c.run()是由JVM创建完本地操作系统线程回调后回调的方法,不手工调用(否则就是普通方法) 二.覆写Runnable接口实现多线程而后覆写run()。推荐第二个 a.覆写Runnable接口实现多线程,可以避免单继承 b.代理模式 当子类实现Runnable接口,此时子类与Thread就是典型的代理设计模式 (相当于子类负责真实业务操作,Thread资源调度、创建线程辅助真实业务) 函数式编程: Runnable r = () -> { System.out.println(); } 对比 继承Thread类 与 实现Runnable接口 区别: a.实现Runnable 接口可以避免多继承局限 b.Runnable实现的多线程可以更好的体现程序共享概念 三.Callable接口实现多线程(jDK1.5新增接口) a

JMeter学习(一)工具简单介绍

随声附和 提交于 2019-12-02 18:38:25
一、JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等等。JMeter可用于模拟大量负载来测试一台服务器,网络或者对象的健壮性或者分析不同负载下的整体性能。 同时,JMeter可以帮助你对你的应用程序进行回归测试。通过你创建的测试脚本和assertions来验证你的程序返回了所期待的值。为了更高的适应性,JMeter允许你使用正则表达式来创建这些assertions. JMeter与LoadRunner比较 JMeter 是一款开源(有着典型开源工具特点: 界面不美观 )测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细;很它的优点也有很多: 开源,他是一款开源的免费软件,使用它你不需要支付任何费用, 小巧,相比LR的庞大(最新LR11将近4GB),它非常小巧,不需要安装,但需要JDK环境,因为它是使用java开发的工具。 功能强大,jmeter设计之初只是一个简单的web性能测试工具,但经过不段的更新扩展,现在可以完成数据库、FTP、LDAP、WebService等方面的测试。因为它的开源性

JVM

牧云@^-^@ 提交于 2019-12-02 18:35:18
1、 简述JVM垃圾回收算法分类 常用的垃圾收集算法 JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而Java堆区和方法区则不一样、不一样!(怎么不一样说的朗朗上口),这部分内存的分配和回收是动态的,正是垃圾收集器所需关注的部分 复制算法: 为了解决Mark-Sweep算法的缺陷,Copying算法就被提了出来。它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题。具体过程如下图所示: 这种算法虽然实现简单,运行高效且不容易产生内存碎片,但是却对内存空间的使用做出了高昂的代价,因为能够使用的内存缩减到原来的一半。 很显然,Copying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低。 复制算法的提出是为了克服句柄的开销和解决内存碎片的问题。它开始时把堆分成 一个对象 面和多个空闲面, 程序从对象面为对象分配空间,当对象满了,基于copying算法的垃圾 收集就从根集合

Java创建线程的四种方式

ⅰ亾dé卋堺 提交于 2019-12-02 18:13:57
1.继承Thread类实现多线程 run()为线程类的核心方法,相当于主线程的main方法,是每个线程的入口 a.一个线程调用 两次start()方法将会抛出线程状态异常,也就是的start()只可以被调用一次 b.native生明的方法只有方法名,没有方法体。是本地方法,不是抽象方法,而是调用c语言方法 registerNative()方法包含了所有与线程相关的操作系统方法 c. run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法) public class MyThread extends Thread { public MyThread() { } public void run() { for(int i=0;i<10;i++) { System.out.println(Thread.currentThread()+":"+i); } } public static void main(String[] args) { MyThread mThread1=new MyThread(); MyThread mThread2=new MyThread(); MyThread myThread3=new MyThread(); mThread1.start(); mThread2.start(); myThread3.start();

后端服务性能优化实战篇

故事扮演 提交于 2019-12-02 16:36:08
本文简单介绍下后端服务开发中常用的一些性能优化策略。 1、代码 优化代码实现是第一位的,特别是一些不合理的复杂实现。如果结合需求能从代码实现的角度,使用更高效的算法或方案实现,进而解决问题,那是最简单有效的。 2、数据库 数据库的优化,总体上有3个方面: 1) SQL调优:除了掌握SQL基本的优化手段,使用慢日志定位到具体问题SQL,使用explain、profile等工具来逐步调优。 2) 连接池调优:选择高效适用的连接池,结合当前使用连接池的原理、具体的连接池监控数据和当前的业务量作一个综合的判断,通过反复的几次调试得到最终的调优参数。 3) 架构层面:包括读写分离、主从库负载均衡、水平和垂直分库分表等方面,一般需要的改动较大,需要从整体架构方面综合考虑。 3、缓存 分类 本地缓存(HashMap/ConcurrentHashMap、Ehcache、RocksDB、Guava Cache等)。 缓存服务(Redis/Tair/Memcache等)。 设计关键点 1、什么时候更新缓存?如何保障更新的可靠性和实时性? 更新缓存的策略,需要具体问题具体分析。基本的更新策略有两个: 1) 接收变更的消息,准实时更新。 2) 给每一个缓存数据设置5分钟的过期时间,过期后从DB加载再回设到DB。这个策略是对第一个策略的有力补充,解决了手动变更DB不发消息

java 面试题(转)

孤街浪徒 提交于 2019-12-02 16:16:44
Java 面试随着时间的改变而改变。在过去的日子里,当你知道 String 和 StringBuilder 的区别就能让你直接进入第二轮面试,但是现在问题变得越来越高级,面试官问的问题也更深入。 在我初入职场的时候,类似于 Vector 与 Array 的区别、HashMap 与 Hashtable 的区别是最流行的问题,只需要记住它们,就能在面试中获得更好的机会,但这种情形已经不复存在。如今,你将会被问到许多 Java 程序员 都没有看过的领域,如 NIO,设计模式,成熟的单元测试,或者那些很难掌握的知识,如并发、算法、数据结构及编码。 由于我喜欢研究 面试题 ,因此我已经收集了许多的面试问题,包括许多许多不同的主题。我已经为这众多的问题准备一段时间了,现在我将它们分享给你们。这里面不但包含经典的面试问题,如线程、集合、equals 和 hashcode、socket,而且还包含了 NIO、数组、字符串、Java 8 等主题。 该列表包含了入门级 Java 程序员和多年经验的高级开发者的问题。无论你是 1、2、3、4、5、6、7、8、9 还是 10 年经验的开发者,你都能在其中找到一些有趣的问题。这里包含了一些超级容易回答的问题,同时包含经验丰富的 Java 程序员也会棘手的问题。 当然你们也是非常幸运的,当今有许多好的书来帮助你准备 Java 面试