字节码

带着新人看java虚拟机03

喜欢而已 提交于 2020-03-14 20:15:40
  分享一篇博客:https://blog.csdn.net/yfqnihao/article/details/8289363,本篇有部分参考这篇博客!!!   还是继续说一下java虚拟机,为什么呢?因为我随意翻着别人的博客一不小心看到有关jvm的一点新的东西,挺有趣的,就按照我的理解分享一下;   还记得以前学过一首诗,“看成岭侧成峰,远近高低各不同”,这一句诗的内在含义有的时候真的会让你猛然惊醒,进而如获至宝!的确,有的时候换一个角度看问题,你会发现不一样的世界。   我们平常学java的时候肯定涉及到了进程,多线程的概念,但是有没有想过操作系统也有进程和线程的概念,两者有关系吗?假如我们视角放高一点,以操作系统的角度看看一个java程序的运行,又会是什么样子的呢?jvm在将字节码文件翻译成机器码之后怎么会调用cpu呢?自己调用的还是假借了谁的手呢?jvm在操作系统中到底扮演着一个什么角色呢?还有最基本的一个问题,操作系统是什么?   下面我们就来把这些东西整个的给串一下,当然,具体的细节还要每个人自己去研究; 1.简单看看操作系统   水平有限,不可能对操作系统理解得那么透彻,只是说说我自己的理解吧!   一说起操作系统大家肯定既陌生又贼熟悉,为什么呢?因为我们经常使用操作系统,比如windows系列,unix系列,macos等等

Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

馋奶兔 提交于 2020-03-14 18:40:07
最近在编写 Python 脚本过程中遇到一个问题比较奇怪: Python 脚本完全正常没问题,但执行总 报错 " AttributeError : ' module ' object has no attribute 'xxx'"。这其实是. pyc 文件存在问题。 问题定位: 查看 import 库的源文件,发现源文件存在且没有错误,同时存在源文件的. pyc 文件 问题解决方法: 1. 命名 py 脚本时,不要与 py thon预留字,模块名等相同 2. 删除该库的. pyc 文件(因为 py 脚本每次运行时均会生成.pyc文件;在已经生成.pyc文件的情况下,若代码不更新,运行时依旧会走pyc,所以要删除.pyc文件),重新运行代码;或者找一个可以运行代码的环境,拷贝替换当前机器的.pyc文件即可 示例: 如下 Python 代码,执行时 报错 " AttributeError : ' module ' object has no attribute 'urlopen'",更新Python27\Lib\urllib2.pyc文件后,即可正常运行。 1 2 3 4 import urllib2 url = " http://www.baidu.com " f = urllib2.urlopen(url, timeout=5).read() print len(f) 附录:

Java 虚拟机的内存结构

蹲街弑〆低调 提交于 2020-03-13 05:38:33
Java虚拟机运行时数据区 整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行的管理(如何分配和回收内存空间)。 运行时数据区通常包括以下这几个部分: 程序计数器(Program Counter Register)   程序计数器(Program Count Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。   由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。   如果线程正在执行的是一个Java方法

Java虚拟机内存结构

萝らか妹 提交于 2020-03-13 05:36:39
起源 1960年Lisp语言: 第一门真正使用内存动态分配和垃圾回收的语言。 运行时数据区域 1.程序计数器 Program Counter Register 1. 当前线程所执行的字节码的行号指示器。 2. 字节码解释器的工作是通过改变这个计数器的值去选取下一条需要执行的字节码指令。 3. 每条线程都一个独立的程序计数器。 4. 如果执行java方法,该位置记录正在执行的字节码指令地址,如果是native方法,该位置为空。 该部分是唯一不会OutOfMemory的部分。 2.Java虚拟机栈 Java Virtual Machine Stack 每一个方法从执行到完成的过程,对应着一个栈帧在虚拟机栈从入栈到出栈的过程。 局部变量表 编译期可知的各种数据类型、对象引用、returnAddress类型。 long、double占用2个局部变量空间(Slot)。局部变量空间大小在编译期确定。 StackoverflowError、OutofMemoryError 3.本地方法栈 Native Method Stack 4.Java堆 Java Heap 虚拟机管理的内存中最大的一块。 所有的对象实例和数组都在堆上分配。(例外:栈上分配、标量替换优化) 线程私有:分配缓冲区(Thread Local Allocation Buffer,TLAB) 5.方法区 Method Area

JAVA的字符串拼接与性能

烈酒焚心 提交于 2020-03-12 19:07:37
概述:本文主要研究的是JAVA的字符串拼接的性能,原文中的测试代码在功能上并不等价,导致concat的测试意义不大。不过原作者在评论栏给了新的concat结果,如果有兴趣的同学建议自己修改代码测试。 在JAVA中拼接两个字符串的最简便的方式就是使用操作符”+”了。如果你用”+”来连接固定长度的字符串,可能性能上会稍受影响,但是如果你是在循环中来”+”多个串的话,性能将指数倍的下降。假设有一个字符串,我们将对这个字符串做大量循环拼接操作,使用”+”的话将得到最低的性能。但是究竟这个性能有多差?如果我们同时也把StringBuffer,StringBuilder或String.concat()放入性能测试中,结果又会如何呢?本文将会就这些问题给出一个答案! 我们将使用Per4j来计算性能,因为这个工具可以给我们一个完整的性能指标集合,比如最小,最大耗时,统计时间段的标准偏差等。在测试代码中,为了得到一个准确的标准偏差值,我们将执行20个拼接”*”50,000次的测试。下面是我们将使用到的拼接字符串的方法: Concatenation Operator (+) String concat method – concat(String str) StringBuffer append method – append(String str) StringBuilder append

JVM字节码解析

不问归期 提交于 2020-03-11 13:57:52
一.字节码查看 将.java源文件编译成.class二进制字节码文件,运行该字节码文件 1.将class字节码文件内容输出到文本文件当中 javap -v xxx.class > xxx.txt 第一个部分: 显示生成class的java源文件的基本信息 Classfile /C:/Users/FLC/Desktop/授课内容/授课案例/Y2170/day22/jvm_project/jvm_day01/target/classes/com/wdksoft/ClassTest.class Last modified 2020-3-11; size 585 bytes MD5 checksum 39fa2636495e5b4bf08da6decc537381 Compiled from "ClassTest.java" public class com.wdksoft.ClassTest minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPER 第二个部分:显示该类所涉及到的常量池,共有35个常量 Constant pool: #1 = Methodref #5.#23 // java/lang/Object."<init>":()V #2 = Fieldref #24.#25 // java/lang

Tomcat8优化--JVM字节码

我是研究僧i 提交于 2020-03-10 19:52:50
JVM字节码   前面我们通过tomcat本身的参数以及jvm的参数对tomcat做了优化,其实要想将应用程 序跑的更快、效率更高,除了对tomcat容器以及jvm优化外,应用程序代码本身如果写 的效率不高的,那么也是不行的,所以,对于程序本身的优化也就很重要了。   对于程序本身的优化,可以借鉴很多前辈们的经验,但是有些时候,在从源码角度方面 分析的话,不好鉴别出哪个效率高,如对字符串拼接的操作,是直接“+”号拼接效率高还 是使用StringBuilder效率高?   这个时候,就需要通过查看编译好的class文件中字节码,就可以找到答案。   我们都知道,java编写应用,需要先通过javac命令编译成class文件,再通过jvm执行, jvm执行时是需要将class文件中的字节码载入到jvm进行运行的。 1、通过javap命令查看class文件的字节码内容 1.1 创建一个简单的测试类 public class Test1 { public static void main(String[] args) { int a = 2; int b = 5; int c = b-a; System.out.println(c); } } 执行成功target目录下便会生成class文件:    1.2 cmd 使用命令 javap -v Test1.class > Test1.txt

python多线程机制

时间秒杀一切 提交于 2020-03-10 11:28:11
Python中的线程从一开始就是操作系统的原生线程。而Python虚拟机也同样使用一个全局解释器锁(Global Interpreter Lock,GIL)来互斥线程多Python虚拟机的使用。 GIL与线程调度   为了理解Pyhon为什么需要GIL,考虑这样的情形:假设有两个线程A B,在两个线程中,都同时保存着对内存中同一对象obj的引用,也就是说,这事obj->ob_refcnt的值为2.如果A销毁对obj的引用,显然,A将通过Py_DECREF调整obj的引用计数值。外面知道,py_DECREF的整个动作可以分为两个部分:   --obj ->ob_refcnt;   if(obj->ob_refcnt == 0) destory object and free memory.   如果A执行完第一个动作后,obj->ob_refcnt的值变为1,不幸的是,在这里时候线程调度机制将A挂起,唤醒了B。更为不幸的是,B同样也开始销毁对obj的引用。B完成第一个动作后,obj ->ob_refcnt为0,B是一个幸运儿,它没有被线程调度打断,而是顺利完成了接下来的第二个动作,将对象销毁,内存释放。好了吗,现在A又被重新唤醒,可现在已是物是人非,obj ->ob_refcnt已经被B减少到0,而不是当时的1.按照约定,A开始在一次地对已经销毁的对象进行对象销毁的内存释放动作

初识btrace

僤鯓⒐⒋嵵緔 提交于 2020-03-10 10:27:21
此文已由作者易国强授权网易云社区发布。 欢迎访问 网易云社区 ,了解更多网易技术产品运营经验。 1 btrace简介 BTrace是一个非常不错的java诊断工具。BTrace 中的B表示bytecode,它是在字节码层面上对代码进行trace ,通过在运行中的java类中注入trace代码, 并对运行中的目标程序进行热交换(hotswap)来达到对代码的跟踪 。BTrace应用较为广泛的原因应该是其安全性和无侵入性,以及热交互技术,使得我们无需启动Agent的情况下动态跟踪分析,其安全性不会导致对目标Java进程的任何破坏性影响,使得BTrace成为我们线上产品问题定位的利器。无侵入性无需我们对原有代码做任何修改,降低上线风险和测试成本,并且无需重启启动目标Java进程进行Agent加载即可动态分析和跟踪目标程序,可以说BTrace可以满足大部分的应用场景。 2 btrace原理 总体来说,BTrace是基于动态字节码修改技术(Hotswap)来实现运行时java程序的跟踪和替换。大体的原理如下所示: Client(Java compile api + attach api) + Agent(脚本解析引擎 + ASM + JDK6 Instumentation) + Socket BTrace的入口类在 https://gi thub.com/btraceio/btrace

JVM内存结构学习

丶灬走出姿态 提交于 2020-03-09 08:08:03
JVM内存结构学习 简介 JVM载执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 Java 虚拟机所管理的内存一共分为Method Area(方法区)、VM Stack(虚拟机栈)、Native Method Stack(本地方法栈)、Heap(堆)、Program Counter Register(程序计数器)五个区域。 这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图所示: 上图介绍的是JDK1.8 JVM运行时内存数据区域划分。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 程序计算器 、程序计数器(Program Counter Register)是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型中,字节码解释器工作时就是通过改变计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 程序计数器是一块 “线程私有” 的内存,每条线程都有一个独立的程序计数器,能够将切换后的线程恢复到正确的执行位置。