jvm

JVM(java 虚拟机)内存设置

别说谁变了你拦得住时间么 提交于 2020-04-06 18:22:13
一、设置JVM内存设置 1. 设置JVM内存的参数有四个: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值; -Xmn Java Heap Young区大小,不熟悉最好保留默认值; -Xss 每个线程的Stack大小,不熟悉最好保留默认值; 2. 如何设置JVM内存分配: (1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效): java -Xmx128m -Xms64m -Xmn32m -Xss16m Test (2)当在集成开发环境下(如eclipse)启动并使用JVM时: a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配): -vmargs -Xms40m -Xmx256m -vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。 此处设置的参数值可以通过以下配置在开发工具的状态栏显示: 在eclipse根目录下创建文件options

Java对象和锁

巧了我就是萌 提交于 2020-04-06 18:04:32
Java对象保存在内存中时,由以下三部分组成: 对象头 实例数据 对齐填充字节 而对象头又由下面几部分组成: Mark Word 指向类的指针 数组长度(只有数组对象才有) 1. Mark Word Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。 Mark Word在不同的锁状态下存储的内容不同,在32位JVM中是这么存的: 其中无锁和偏向锁的锁标志位都是01,只是在前面的1bit区分了这是无锁状态还是偏向锁状态。Epoch是指偏向锁的时间戳。 JDK1.6以后的版本在处理同步锁时存在锁升级的概念,JVM对于同步锁的处理是从偏向锁开始的,随着竞争越来越激烈,处理方式从偏向锁升级到轻量级锁,最终升级到重量级锁。 JVM一般是这样使用锁和Mark Word的: step1:当没有被当成锁时,这就是一个普通的对象,Mark Word记录对象的HashCode,锁标志位是01,是否偏向锁那一位是0。 step2:当对象被当做同步锁并有一个线程A抢到了锁时,锁标志位还是01,但是否偏向锁那一位改成1,前23bit记录抢到锁的线程id,表示进入偏向锁状态。 step3:当线程A再次试图来获得锁时

如何设置jvm内存

时光怂恿深爱的人放手 提交于 2020-04-06 16:15:52
本文向大家简单介绍一下进行JVM内存设置几种方法,安装Java开发软件时,默认安装包含两个文件夹,一个JDK(Java开发工具箱),一个JRE(Java运行环境,内含JVM),其中JDK内另含一个JRE。如果只是运行Java程序,则JRE已足够;而JDK则只有开发人员才用到。这里将为大家介绍设置JVM内存分配的几招。 工具/原料 一台电脑 方法/步骤 1 -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值; -Xmn Java Heap Young区大小,不熟悉最好保留默认值; -Xss 每个线程的Stack大小,不熟悉最好保留默认值; 2 2. 如何分配JVM内存设置: (1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效): java -Xmx128m -Xms64m -Xmn32m -Xss16m Test (2)当在集成开发环境下(如eclipse)启动并使用JVM时: a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配): -vmargs -Xms40m -Xmx256m

面试刷题25:jvm的垃圾收集算法?

依然范特西╮ 提交于 2020-04-06 11:05:52
垃圾收集是java语言的亮点,大大提高了开发人员的效率。 垃圾收集即GC,当内存不足的时候触发,不同的jvm版本算法和机制都有差别。 我是李福春,我在准备面试,今天的问题是: jvm的垃圾回收算法有哪些?有哪些垃圾收集器? 答:jvm的垃圾回收首先需要标注出可回收的对象,采用的是可达图算法(从对象出发,绘制出出对象的引用关系图, 当从活动对象出发,在图中不可达的对象即可标注为可回收对象) jvm的垃圾回收算法有3种,列举如下: 1, 标记清除算法。(即把标注的可回收对象直接清理,这样会带来内存碎片化的问题,而且效率不高); 2,标记整理算法。(即把标注的可回收对象清理,在清理的过程中整理内存,解决了内存的碎片化问题); 3,标记复制算法。(把标注的对象清理,没有清理的对象复制到to区,然后互换引用,解决了内存碎片化的问题,但是需要维护对象关系带来一定代价) 垃圾收集器常见的有如下4种,随着jdk的版本迭代在不断增加。列举如下: 1,serialGC , 即单线程垃圾回收,优点是简单,缺点是会引起stop-the-world的问题,是早期版本的垃圾收集器 2,ParallelGC,即并行垃圾收集器,(新生代,老年代的收集是并行的),适合吞吐量比较的场景; 3,CMSGC,响应时间优先的垃圾收集器,适合web应用,会带来内存碎片化的问题。 4,G1GC,兼顾响应时间和吞吐量的垃圾收集器

图解JVM内存区域划分

你说的曾经没有我的故事 提交于 2020-04-06 05:26:26
图解JVM类加载机制和双亲委派模型 一文中讲述了 Java 类加载的过程,它包含 加载、验证、准备、解析、初始化、使用、卸载 这 7 个步骤。在准备阶段,JVM会将类加载到内存中,为类变量分配内存并赋予初值;在初始化阶段则会正式执行初始化代码。 那么在准备阶段和初始化阶段,JVM 具体是怎么为类分配内存的呢? JVM 把字节码文件加载进来之后放在哪里?代码运行的时候,方法和局部变量放在哪里?创建的对象又该放在哪里? 方法区/Metaspace:JVM加载进来的字节码文件会保存在方法区,Java8之后被称为Metaspace,里面保存类的基本信息。 字节码执行引擎:JVM 加载的字节码文件由字节码执行引擎来执行。 程序计数器:字节码是一行行的CPU指令,由CPU逐行执行,执行到哪一行了,就是由程序计数器来记录 栈内存:Java是多线程的,Java代码是由线程来执行的,每个线程都有各自的调用栈。执行方法时,栈帧进入调用栈,栈帧中有局部变量、方法返回值等信息。 堆内存:堆中保存Java创建的对象,栈中的局部变量可以持有堆中对象的引用。 最后我把整个过程串联一下: 有两个类,在使用时由JVM的类加载器进行加载,进入到方法区 由字节码执行引擎执行字节码文件 Java是多线程的,可以启动多个线程执行代码,每个线程都有自己的栈内存 执行方法,栈帧入栈,方法执行完成,栈帧出栈。栈帧中保存着局部变量

Setting -XX:MaxRam

你。 提交于 2020-04-06 04:38:01
问题 According to this link, there is an option to set MaxRamSize manually to restrict the JVM to not use memory beyond this. But I have not seen any documentation of the same. I've never known this. Is there anything like this or anything similar? PS. I know and I'm not looking to set heap/stack/metaspace/native memory sizes. I just would like to know if there is an overall memory limiting option. Trying it did not help as It errored out: Improperly specified VM option 'MaxRAM=1073741824B' Could

Setting -XX:MaxRam

北城以北 提交于 2020-04-06 04:35:28
问题 According to this link, there is an option to set MaxRamSize manually to restrict the JVM to not use memory beyond this. But I have not seen any documentation of the same. I've never known this. Is there anything like this or anything similar? PS. I know and I'm not looking to set heap/stack/metaspace/native memory sizes. I just would like to know if there is an overall memory limiting option. Trying it did not help as It errored out: Improperly specified VM option 'MaxRAM=1073741824B' Could

深度探索JFR

会有一股神秘感。 提交于 2020-04-06 03:45:20
本文基于 OpenJDK 11 并涉及一些之后版本的特性,非 OpenJDK 11 的特性会被特殊标记出来 什么是 JFR? 我们都知道,黑匣子是用于记录飞机飞行和性能参数的仪器。在飞机出问题后,用于定位问题原因。JFR 就是 Java 的黑匣子。 JFR 是 Java Flight Record (Java飞行记录) 的缩写,是 JVM 内置的基于事件的JDK监控记录框架。这个起名就是参考了黑匣子对于飞机的作用,将Java进程比喻成飞机飞行。顾名思义,这个记录主要用于问题定位和持续监控。 如果是利用默认配置启动这个记录,性能非常高效,对于业务影响很小,因为这个框架本来就是用来长期在线上部署的框架。这个记录可以输出成二进制文件,用户可以指定最大记录时间,或者最大记录大小,供用户在需要的时候输出成文件进行事后分析。 JFR 的前身也是 JFR,只不过这个 J 不是 Java 而是 JRockit。在 JRockit 虚拟机时代,就有这样一个工具用来记录 Java 虚拟机运行时各项数据。在 Oracle 收购 Sun 公司之后,Hotspot 虚拟机时代,也一直延续了这个工具: JFR 0.9 版本对应 JDK 7 和JDK 8:JDK 7u40 之后,实现了和 JRockit Flight Recorder 一样的功能,并添加了各项数据配置,用来打开或者关闭一些统计数据功能。而且,在

JAVA学习 :Java程序设计环境

强颜欢笑 提交于 2020-04-06 03:43:21
JVM:Java虚拟机 保证了Java的跨平台性(Java是跨平台的,而JVM不是) JRE:Java程序运行环境(JVM+核心类库) JDK:Java开发工具箱(JRE+开发工具) 1.下载JDK 访问Oracle网址下载。 2.安装JDK A:在D盘建立一个目录,如 develop B:傻瓜式安装,修改安装的路径到d盘的develop C:路径如下 JDK: D:\develop\Java\jdk1.7.0_72\ JRE: D:\develop\Java\jre7\ 配置path环境变量 作用: 让Java命令可以任意目录下使用。 配置方法: 方式1   把JDK的bin目录配置到path中。   修改系统属性中的path环境变量:   D:\develop\Java\jdk1.7.0_72\bin;以前的path内容 b:方式2   创建新的变量名称:   变量名:JAVA_HOME   变量值:D:\develop\Java\jdk1.7.0_72 修改path变量:   用%%引用JAVA_HOME即可。   %JAVA_HOME%\bin;以前的path内容 等价于下面的内容:   D:\develop\Java\jdk1.7.0_72\bin;以前的path内容 来源: https://www.cnblogs.com/shaofanglazi/p/6672087

java中的==、equals()、hashCode()源码分析

人盡茶涼 提交于 2020-04-06 02:59:34
== 比较的是两个值是否相等 这里的值有可能是基础类型的值,也有可能是指向对象的引用 equals方法如何比较,要看这个类的equals方法是如何定义的 基类Object类的equals方法比较的是两个对象的引用是否相同,其结果相当于 == String类重写了equals方法,比较的是两个字符串序列是否相等 java中的==、equals()、hashCode()源码分析 在java编程或者面试中经常会遇到 == 、equals()的比较。自己看了看源码,结合实际的编程总结一下。 1. ==   java中的==是比较两个对象在JVM中的地址。比较好理解。看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 String s3 = new String("nihao"); 6 System.out.println(s1 == s2); // true 7 System.out.println(s1 == s3); // false 8 } 9 }   上述代码中:   (1)s1 == s2为true,是因为s1和s2都是字符串字面值"nihao"的引用