jvm

深入理解Java:String

社会主义新天地 提交于 2020-02-07 07:00:51
在讲解String之前,我们先了解一下Java的内存结构。 一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。 JVM主要管理两种类型内存:堆和非堆,堆内存(Heap Memory)是在 Java 虚拟机启动时创建,非堆内存(Non-heap Memory)是在JVM堆之外的内存。 简单来说,非堆包含方法区、JVM内部处理或优化所需的内存(如 JIT Compiler,Just-in-time Compiler,即时编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码。 Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。 堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小, 生存期也不必事先告诉编译器 ,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。    栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 栈中主要存放一些基本类型的变量数据(int, short, long,

回顾与展望--java的是是非非_2013

白昼怎懂夜的黑 提交于 2020-02-07 05:05:47
这篇文章会讲述2012年发生的一些大大小小事件,并且对2013年进行一点预测。有些仅仅只是猜测而已….好吧,我只能说我邪恶的一面已经暴露出来了。   多的就不说了,我们来看看2012年发生的关于Java的一些事情。   2012 – 回顾   对于 Java,JVM 和社区而言,2012 年是动荡的一年。James Governer(RedMonk 的分析师)说过“2012 是 Java 发展的第二个阶段的曙光”。   Java 进入云计算(这次是来真的)   基于 Java/JVM 提供的云平台在 2012 年成为了现实,它带来了很多新的 PAAS 和 IAAS 产品。Cloudbees,JElastic,Heroku, Joyent, Oracle 现在只是众多云平台中的 5 个而已。对于作为开发者的你而言,这意味着什么呢?好吧,这意味则你有更多的选择,并且可以花很少的成品来使用不同的云空间。我强烈建议你在空闲的时候试用一下这些产品(你只需要花费几分钟的时间就可以创建一个免费账号),然后来看看这些东西到底是什么。   与之相反的是,这个领域还缺少一个行业标准,尽管 JEE8 承诺会改变这个现状(假设提供商们都参与的话)——但是在接下来的几年里你还是需要仔细考虑锁定某一个平台。如果你比较关心如何让任意的服务/代码能够在不同的平台上运行的话,那么我推荐你去看看 jClouds 的

JVM运行时数据区详聊!!

感情迁移 提交于 2020-02-07 04:24:34
运行时数据区 Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。这些数据区域中的一些是在Java虚拟机启动时创建的,只有在Java虚拟机退出时才被销毁。其他数据区域是每个线程。每个线程数据区域是在线程退出时创建并销毁线程时创建的。 01 方法区 在jvm官网中说,方法区只有一个,属于线程共享的一块内存区域,生命周期是跟虚拟机一样的。它存储每类结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括在类和实例初始化以及接口初始化中使用的特殊方法 方法区域是在虚拟机启动时创建的。尽管方法区域在逻辑上是堆的一部分,但是简单的实现可以选择不垃圾收集或压缩它。垃圾回收器不太会回收方法区的垃圾 如果方法区域中的内存无法满足分配请求,Java虚拟机将抛出OutOfMemoryError。 堆 Java虚拟机有一个堆,在所有Java虚拟机线程之间共享。堆是运行时数据区域,从中为所有类实例和数组分配内存 如果计算需要的堆比自动存储管理系统提供的堆多,Java虚拟机将抛出OutOfMemory错误 虚拟机栈 每个Java虚拟机线程都有一个私有Java虚拟机堆栈,与线程同时创建。 它保存局部变量和部分结果,并在方法调用和返回中发挥作用。由于Java虚拟机堆栈除了推送和弹出帧之外从不直接操作,因此可以对帧进行堆分配。 程序计数器 每个Java虚拟机线程都在执行单个方法的代码

Java内存区域

霸气de小男生 提交于 2020-02-07 04:16:32
Java内存区域与OOM 文章目录 Java内存区域与OOM 引言 概述 内存区域 程序计数器 VM Stack虚拟机栈 Native Stack本地方法栈 Heap堆内存 方法区与常量池 Direct Memory直接内存 讲讲OOM 总结 引言 一句契合Java/C++使用者的话,“两者之间存在一堵由内存分配与GC技术筑建起来的高墙,墙里面的人想出去,墙外面的人却想进来”。 概述 Java有着自动的内存分配管理机制,也有自己独特的内存回收机制,只有熟练掌握这些知识,才能够真正地使用这门语言 内存区域 先上一个内存区域图: 如图,JAVA运行时内存区域分为 方法区(线程共享) 堆(线程共享) 虚拟机栈(线程私有) 本地方法栈(线程私有) 程序计数器(线程私有) 下面我们来讲讲这些内存区域所负责的工作。 程序计数器 JVM中的程序计数器与操作系统中的程序计数器功能是一致的,只不过操作系统的程序计数器记录的是下一条执行指令的地址,而JVM的程序计数器记录的是“当前”线程执行的字节码指令或者分支、循环、异常、线程恢复等功能的字节码支持。 程序计数器对不同方法的支持 Java method JNI 记录执行的字节码指令地址 Native方法这个计数器记录为空值 程序计数器是JVM中唯一不会出现OOM的地方。 VM Stack虚拟机栈 JVM中的虚拟机栈也是线程私有的

Forking tests fail because javaOptions seems to be misconfigured

£可爱£侵袭症+ 提交于 2020-02-07 03:45:31
问题 Using Play 2.X, I expect my tests to be forked by default (new way from Play 2.X) and especially well run. However, when using this SBT configuration in my Build.scala , I observe an OOM due to permgen space, like the following: Uncaught exception when running myspecs.AllSpecs: java.lang.OutOfMemoryError: PermGen space sbt.ForkMain$ForkError: PermGen space at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) at java.security

Java重排序

笑着哭i 提交于 2020-02-07 01:35:23
之前听公司讲座说到的设计模式,经典的懒汉式单例模式会有重排序问题,当时不是很理解,后来深入学了JVM终于恍然大悟,这里做个总结分享。 重排序排序的就是操作指令的顺序,改变了指令的执行顺序。重排序首先要知道字节码.class文件,它就是JavaC编译后的那个字节码文件,它里面有操作指令的执行顺序,程序计数器就是根据字节码的操作指令的顺序进行寻址查找属性和方法进行操作。JVM会自行判断,把速度快的逻辑简单的代码先执行。 但是有的情况下,JVM会自己对执行指令进行一些优化,比如我们知道for循环重复读取一个值,它会直接从缓存中读取,这时候值就算发生改变JVM也没及时发现。就要加volatile关键字修饰那个属性值,volatile关键字简单来说,就是不让JVM进行优化。 重排序问题也是JVM做的优化,但是变成了好心做坏事。 比如单例模式下,我们都知道创建对象过程中,分配空间是在加载阶段,而里面有什么属性什么方法,都是初始化阶段才有的。JVM优化后就可能直接return了一个全部是null的只是分配了内存空间但是没有初始化的对象。 来看简单的懒汉式单例模式例子: public class Singleton { private static Singleton instance ; private Singleton ( ) { } public static synchronized

JVM的内存区域划分

纵然是瞬间 提交于 2020-02-06 10:00:39
内存区域 运行时数据区主要分为: 方法区,堆,程序计数器,虚拟机栈,本地方法栈 主要功能: 方法区(Method Area) 用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区域又被称为“永久代”,但这仅仅对于Sun HotSpot来讲,JRockit和IBM J9虚拟机中并不存在永久代的概念。 堆(Heap) 它是JVM用来存储对象实例以及数组值的区域,Java中所有通过new创建的对象的内存都在此分配,是垃圾收集器管理的主要区域。 程序计数器(Program Counter Register) 指向当前线程正在执行的行号,用来保证线程切换时回到程序调用的位置。 虚拟机栈(Virtual Machine Stacks) Java栈是Java方法执行的内存模型。它用来存储当前线程运行方法所需要的数据、指令、返回地址。(即局部变量和正在调用的方法)方法被调用时会在栈中开辟一块叫栈帧的空间,方法运行在栈帧空间中。 本地方法栈(Native Method Stacks) 和虚拟机栈类似,只是它描述的是为虚拟机是用到的Native方法出栈和入栈的过程(通常我们不需要了解这块,它底层是C语言实现的) 参考资料:    http://blog.csdn.net/ns_code/article/details/17565503    http://www

深入理解JVM( 一 )--类加载过程详解

巧了我就是萌 提交于 2020-02-06 06:20:21
深入理解JVM( 一 )–类加载过程详解 文章目录 深入理解JVM( 一 )--类加载过程详解 一、Java文件从编码完成到最终执行过程 二、类加载过程详解 1、类加载的过程 2、类加载五个阶段: 2.1 加载: 2.2 链接:包含验证、准备、解析三个过程 2.21 验证 2.22 准备 2.23 解析 2.3 初始化 如果向学习和理解JVM的话,《深入理解JVM虚拟机》这本圣经必不可少的,我也是你们其中一份子,这本书看了一遍后有很多不懂,沮丧。。。也不敢装懂,不过该懂得还是懂一些,因此打算写几篇JVM得博客,巩固知识,也希望大伙能提点我的错误和不足 《深入理解JVM虚拟机》的分享链接:链接:https://pan.baidu.com/s/1fnTMWfC7Zi3HVJ5C78O80Q 提取码:hhmo 一、Java文件从编码完成到最终执行过程 编译:Java文件通过javac命令编译生成字节码,也就是.class文件 运行:.class文件交给JVM虚拟机进行 类加载 ,到最后执行过程 二、类加载过程详解 1、类加载的过程 过程: JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。 注意点:JVM 不是一开始把所有的类 加载进内存,而是需要的时候 有且仅有一次 加载 2、类加载五个阶段: 类加载的顺序除了 解析 之外是 固定 的( 可以在

Java基础

倾然丶 夕夏残阳落幕 提交于 2020-02-06 02:35:54
面向对象及三大特性 答:面向对象是一种思想,将复杂问题简单化,把相关数据和方法当作一个整体来看。三大特性为封装继承和多态。 封装:将事物封装为一个类,减少耦合,隐藏细节。保留接口与外界联系,当接口内部改变时,不会影响外部的调用。 继承:从一个已知的类中派生一个新的类,新类拥有已知类的属性和方法,并能重写或覆盖来增加已知类的能力。 多态:一个程序中存在多个同名的不同方法。实现方式:子类对父类的覆盖、类对方法的重载、子类作为父类对象使用。 关于封装 对类进行内部处理,在get/set方法中进行内部逻辑封装,外部直接调用。 关于继承 覆盖@Override 覆盖=重写,即父类有方法A,子类拓展了方法A并加了新功能,则称之为子类覆盖或重写了方法A。 关于多态 重载Overload 一个类中存在多个同名的不同方法,这些方法参数个数、顺序和类型不同构成方法的重载。 构造器不能被重写,但能被重载 **只有返回值不同,不构成重载!**因为有时我们调用方法并不关心其返回值。 子类对象作为父类对象使用 涉及向上转型和向下转型。向上可以直接转,子类通父类。向下需要强制类型转换,父类不懂子类。 JDK、JRE和JVM 答:基本概念如下: JDK(Java Development Kit)开发工具包,java开发环境的核心组件,提供编译调试和运行java程序所有的工具和文件。 JRE(Java

在Cacti添加resin jvm监控

核能气质少年 提交于 2020-02-05 18:15:41
修改snmp配置文件 vim /etc/snmp/snmpd.conf 在snmpd.conf文件末尾添加 proxy -v 2c -c public 127.0.0.1:1161 .1.3.6.1.4.1.42 修改jdk配置 cd $JAVA_HOME/jre/lib/management vim management.properties 找到 #com.sun.management.snmp.port=<port-number> 改成 com.sun.management.snmp.port=1161 找到 #com.sun.management.snmp.interface=0.0.0.0 改成 com.sun.management.snmp.interface=127.0.0.1 复制snmp.acl文件 cp snmp.acl.template snmp.acl 配置JVM其允许通过snmp访问权限 vim snmp.acl 找到 # acl = { # { # communities = public, private # access = read-only # managers = localhost # } # } # # # trap = { # { # trap-community = public # hosts = localhost # } # }