jvm

JVM内存模型1

ε祈祈猫儿з 提交于 2020-02-08 15:21:20
转载自: https://www.liangzl.com/get-article-detail-121504.html 抽象 解析 程序计数器 程序计数器(Program Counter Register)是 JVM 中一块较小的内存区域,保存着当前线程执行的虚拟机字节码指令的内存地址(可以看作当前线程所执行的字节码的行号指示器)。 如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址(可以理解为上图所示的行号),如果正在执行的是native方法,这个计数器的值为undefined。 JVM的多线程是通过线程轮流切换并分配CPU执行时间片的方式来实现的,任何一个时刻,一个CPU都只会执行一条线程中的指令。为了保证线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程间的程序计数器独立存储,互不影响。 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,因为程序计数器是由虚拟机内部维护的,不需要开发者进行操作。 虚拟机栈 虚拟机栈(Java Virtual Machine Stacks)是线程隔离的,每创建一个线程时就会对应创建一个Java栈,即每个线程都有自己独立的虚拟机栈。这个栈中又会对应包含多个栈帧,每调用一个方法时就会往栈中创建并压入一个栈帧,栈帧存储局部变量表、操作栈、动态链接

Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

…衆ロ難τιáo~ 提交于 2020-02-08 12:56:18
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么。虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事儿,更重要的是不成体系的内容对读者也不够友好。所以以后的博客尽量按系列来写,不过偶尔也会穿插其他的内容。接下来一段时间我会把写博客的重点放在 JVM (Java Virtual Machine) 和 JUC (java util concurrent ) 上,对 Java 虚拟机和 Java 并发编程进行一系列的介绍,欢迎关注。 了解 JVM 是对 Java 开发人员的基本要求,JVM 的相关内容自然也成了现在 Java 程序员面试的重要考点。不过估计很多小伙伴和我一样,长时间醉心于 CRUD,却忘了去了解一下更底层、更基础的东西,殊不知这些才是决定你能在这条路上走多远的关键因素,那接下来我们就一起来深入学习一下看似神秘的 JVM 吧。JVM 总体来看内容还是很多的,我会把最重要的内容介绍给大家,不过如果你有时间和精力的话,还是推荐你去看一下《深入理解Java虚拟机》这本书,确实是有口皆碑。本系列文章也会引用很多此书的内容并加上我自己的理解,如果你坚持看下去的话,相信会有很大的收获。 首先对 JVM 做个简单的介绍,JVM 是 JDK 的一部分,《Java 虚拟机规范》(The

jvm file.encoding 属性引起的 MapReduce/HBase 乱码问题

青春壹個敷衍的年華 提交于 2020-02-08 09:26:32
http://cache.baiducontent.com/c?m=9d78d513d99b05f04fede52a56488071182497634bc0d1652888c215c53f07145321a3e52878564291d27d141cb20c19afe736056e507ceec894df0f9cac925f7ed578290b6ddf164e8642f39c5b768171ca01adf858fabbf73393afc5d3a815098c0c5b&p=9e759a45d7c15bbc1cb38c2d021485&newp=8b2a97568e8011a058ec962452488b231610db2151d3d5136c8cd0&user=baidu&fm=sc&query=jvm+file%2Eencoding&qid=&p1=3 1、问题: 最近在往 HBase 写中文的时候,发现 hbase 查出来的数据会有部分中文乱码了,而部分中文又是正常的,按理来说,一般的乱码问题要么全乱,要么不乱。考虑到出现中文的地方都是来源于 hdfs 上的一个配置文件,而这个配置文件可以确定是 utf-8 编码的,那排除了原始文件导致的乱码,想想 MR 代码里也没有转码的逻辑,也排除了代码的问题,那就只有一种可能:Hadoop 集群的系统环境是异构的,这里面可能涉及到 linux

JVM内存模型

会有一股神秘感。 提交于 2020-02-08 06:16:09
如果想了解JVM内存模型,首先我们要知道JVM是什么?JVM全称 Java Virtual Machine ,即Java虚拟机,是用于运行Java程序编译后的字节码文件。 JVM最常见的三种有:1.Sun公司的 HotSpot,是目前使用最广泛的Java虚拟机。2.BEA公司的 JRockit,后来被 Oracle收购。3.IBM公司的 J9VM。 我们知道,Java的口号是: “Write once, run anywhere”,即一次编写,到处运行。为什么可以做到这样呢,其实就是依赖于JVM。在不同的操作系统上,只要安装了对应的虚拟机,那么同样的一份代码,就可以随意移植。 当编写完Java代码时,即产生 .Java文件,会通过Java编译器编译为.class 文件,然后通过Class Loader把类信息加载到JVM中,最后JVM再去调用操作系统。这样,只要JVM正确执行.class文件,就可以实现跨平台了。 以下即为JVM的内存模型图: 程序计数器: 程序计数器是一块较小的内存,可以看做是当前线程所执行的字节码的行号指示器,即记录当前线程所执行到的字节码的行号。当字节码解释器工作时,就是通过改变计数器的值来选取下一条需要执行的字节码指令。由此来完成分支、循环、跳转、线程恢复、异常处理等功能。 程序计数器是线程私有的(即每个线程拥有一个程序计数器)

java tomcat jvm优化

假装没事ソ 提交于 2020-02-08 02:30:17
tomcat执行器(线程池)的优化 tomcat默认是没有启用线程池的,在tomcat中每一个用户请求都是一个线程,所以我们可以使用线程池来提高性能。tomcat的前段有一个调度线程,会将用户的请求放入线程池中,一定时间后线程池中的用户请求任务就变为工作线程。 1、开启线程池:打开server.xml中关于线程池的配置 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="600" minSpareThreads="10"/> 重要参数说明: name :共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None; namePrefix :在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-; maxThreads :该线程池可以容纳的最大线程数。默认值:200; maxIdleTime :在tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。 minSpareThreads

Java--基础知识之JVM

走远了吗. 提交于 2020-02-08 01:34:21
一、什么是JVM 1、概念 JVM,即Java Virtual Machine(Java虚拟机),是Java和的核心和基础,是在Java编译器和操作系统平台间的虚拟处理器。JVM是利用软件方法实现的抽象的、计算机基于下层的操作系统和硬件平台可以在上面执行Java程序的字节码程序。 2、特点 JVM有完善的硬件架构(如处理器、堆栈、寄存器),其存在是为了支持与操作系统无关,实现Java跨平台。 3、Java的跨平台性 真正跨平台的是Java程序而非JVM。不同平台下安装了不同版本的JVM。编写的Java源码在编译后生成class文件(字节码文件),JVM是负责将这些字节码文件翻译成特定平台下的机器码然后运行,即在不同平台下安装对应的JVM,就可以运行编写的Java程序。而这个过程中Java程序没有做任何改变,只是通过JVM在不同平台上运行罢了,可以说是“一次编译,多处运行”。 4、启动与消亡 JVM负责运行一个Java程序,当启动一个Java程序时,也产生一个虚拟机实例,当程序关闭时这个虚拟机实例也消亡。 JVM运行起点:Java虚拟机实例通过调用某个初始类的main方法来运行Java程序,这个main方法是共有的、静态的、返回值为void类型,并传入一个字符串数组作为参数。 5、两种线程 (1)守护线程:通常由虚拟机自己使用,比如执行垃圾收集任务的线程

JVM学习之类加载器命名空间

那年仲夏 提交于 2020-02-08 00:45:20
先把知识点总结一下: 1.每个类加载器都有自己的命名空间,命名空间由该加载器及所有父加载器所加载的类组成。 2.在同一个命名空间里,不会出现类的完整名字(包括类的包名)相同的两个类。 3.在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类。 4.子加载器加载的类能加载父加载器加载的类。 5.父加载器加载的类不能加载子加载器锁加载的类。 后面会详细的解释上面所述,请继续关注后面的博客。 先举个例子,里面后面包含四个类: JavaTest1.java:用来调用加载器加载的主类。 JVMTest1.java:自定义类加载器。 People.java:类中只包含一个无参构造函数,在其中创建了一个Man类的对象。 Man.java:只包含一个无参构造函数。 接下来依次贴代码: JavaTest1.java public class JavaTest1 { public static void main(String[] args) throws Exception { /*loader1加载器*/ JVMTest1 loader1 = new JVMTest1("loader1"); loader1.setPath("C:\\Users\\admin\\Desktop\\"); Class<?> clazz1 = loader1.loadClass("People");

day_01

依然范特西╮ 提交于 2020-02-08 00:02:08
Day_01 1计算机语言发展简史 机器语言,汇编语言,高级语言 java是第三代高级语言 2计算机基础知识 2.1二进制与十进制之间相互转化 二进制转十进制: eg: 100110 每一位分别对应1,2,4,8,16,32。对应二进制为1的相加 2+4+32=38 十进制转二进制: eg: 38 38 = 32+4+2 。转化后为100110 2.2存储单元-字节 计算机中最小的存储单位,计算机中任何文件,都是已字节形式存储 8bit = 1B 2.3常用Dos命令 D:进入D盘 cd :显示当前目录 cd … : 进入父目录 dir : 显示目录中的内容 3Java 3.1Java分类 javaSE S 标准 E 版本 -> 桌面软件 Java游戏 (Java语言核心) javaEE E 企业 E 版本 -> 企业级软件 javaME M 微小 E 版本 -> 手机、平板、移动设备 Android 3.2Java语言的优势 面向对象 跨平台 “一次编写,到处运行” PC端 服务器端 操作系统 window linux Mac 移动端 Android… GC 垃圾回收 健状、效率高(线程)安全性() Scala Java Python 算法 100 -50 10 Java 语言开发环境搭建(必须掌握) JVM java 虚拟机(Java Virtual Machine )

JVM基础快速入门篇

妖精的绣舞 提交于 2020-02-07 21:00:16
Java是一门可以跨平台的语言,但是Java本身是不可以实现跨平台的,需要JVM实现跨平台。javac编译好后的class文件,在Windows、Linux、Mac等系统上,只要该系统安装对应的Java虚拟机,class文件都可以运行。达到”一次编译,到处运行”的效果。 一、JVM是什么? 而JVM到底是什么呢?引用百度百科对JVM的介绍: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 二、JVM架构知识 1.JVM主要包含 类装载器、运行时数据区(内存模型)、执行引擎 。里面内存模型有可以细分包括本地方法栈、堆、栈(线程)、方法区(元空间)、程序计数器。如图所示: 1. 类装载器的作用就是负责加载class文件,class文件在文件开头有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载 ,至于它是否可以运行,则由执行引擎(Execution Engine)决定。类加载器又有四大类加载器: 启动类加载器(Bootstrap ClassLoader):负责加载JRE核心类库,像JRE中的rt.jar等(C/C++); 扩展类加载器

我以为对jvm性能调优很了解,直到我到阿里面试完之后

江枫思渺然 提交于 2020-02-07 11:27:13
相信很多人对于性能调优都不陌生,为了获得更好的系统性能,或者是为了满足不断增加的业务需求。 都需要用到我们的性能调优。所以性能优化在面试中出现的频率特别高 楼主自认为自己对性能优化相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。 但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在性能优化方面的知识,只是个小学生水平。 以下,是我总结的一次阿里面试中关于jvm性能优化的面试问题以及知识点。 一、JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。 2.导致Full GC的原因 1)年老代(Tenured)被写满 调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 。 2)持久代Pemanet Generation空间不足 增大Perm Gen空间,避免太多静态对象 , 控制好新生代和旧生代的比例 3)System.gc()被显示调用 垃圾回收不要手动触发,尽量依靠JVM自身的机制 在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节