jvm

synchronized

女生的网名这么多〃 提交于 2020-02-12 04:55:39
首先讲一下原子性以及互斥。 举个例子,在32位CPU上执行long(64位)变量的写操作时,会存在多线程下读写不一致的问题。 因为32位CPU下对其写会拆分成两次操作,一次写高32位和一次写底32位,而这个操作无法保证其 原子性 所以产生并发问题了。 原子性 指即一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行,简单的说就是一个或者多个操作在 CPU 执行的过程中不被中断的特性。 互斥 如果 同一时刻只有一个线程执行 则被称之为 互斥 ,把一段需要互斥执行的代码称为 临界区 。如果我们能够保证对共享变量的修改是互斥的,那么,无论是单核 CPU 还是多核 CPU,就都能保证原子性了。 互斥锁 锁是一种通用的技术方案,Java 语言提供的 synchronized 关键字,就是一种互斥锁。synchronized 关键字可以用来修饰方法,也可以用来修饰代码块,通过其修饰的临界区是互斥的,使用方法如下: public class demo{ private final Object monitor = new Object(); // 修饰非静态方法 synchronized void method1() { // 临界区 } // 修饰静态方法 synchronized static void method2() { // 临界区 } // 修饰代码块

我的JVM学习笔记:第二章——类加载子系统

老子叫甜甜 提交于 2020-02-12 04:26:40
我的JVM学习笔记:第二章——类加载子系统 感谢尚硅谷宋红康老师的JVM入门到精通课程,向每一个用心做免费教课程的老师致敬! 本套教程均为我学习课程之后的学习笔记,防止遗忘,并发送给大家分享,感谢大家查看~ 本章包含知识点:类的加载过程,不同类加载器详解,双亲委派机制/沙箱安全机制,自定义类加载器! 一、类加载器概念 java中的类要加载到jvm中才能使用,那么负责把java类从硬盘或网络等加载到jvm中的工具,就是类加载器(ClassLoader)。 注意: 类加载器加载的.class文件后,类的信息和常量池会被存放到方法区 只有特定开头的标识.class文件会被加载,这个标识为CAFEBABE 类加载器只负责加载.class文件,至于他是否可以运行,则由执行引擎所决定 举例说明: 演员(执行引擎)表演时,道具师(道具师)会提前将道具搬上舞台,而至于表演是否能正常进行,则由演员决定。 额外补充:常量池 在Java程序中,有很多的东西是永恒的,不会在运行过程中变化。比如一个类的名字,一个类字段的名字/所属类型,一个类方法的名字/返回类型/参数名与所属类型,一个常量,还有在程序中出现的大量的字面值。 public class ClassTest { private String itemS = "我们 " ; private final int itemI = 100 ;

调整JVM内存大小

﹥>﹥吖頭↗ 提交于 2020-02-12 01:17:40
首次运行公司项目,出现了内存溢出,具体出现java.lang.OutOfMemoryError: PermGen space和java.lang.OutOfMemoryError:GC overhead limit exceeded异常 调整运行时JVM内存大小主要有两种方式: 1,在Eclipse中配置 Eclipse中的Window-->Preferences-->Java-->Installed JREs-->Edit,在Default VM arguments中配置如下 参数     -Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=1024m -XX:MaxPermSize=512m   具体可配置的参数还有很多,此处仅设置了这几个参数,有需要设置别的参数的同学,请自行添加即可。 2,在Tomcat的配置文件中配置    Tomcat分为安装板(.exe)和解压版(.zip,tar.zip,解压即用无需安装的),二者JVM参数的配置方式有区别,这里只介绍解压版的JVM参数内存配置方式,安装板的配置方式 不同,有兴趣的同学可以自行查找。    打开Tomcat-->bin-->catalina.bat,在@echo off后的第一行加入 set JAVA_OPTS=-Xmx512m -Xms512m -XX

JVM的判断对象是否已死和四种垃圾回收算法总结

痴心易碎 提交于 2020-02-12 00:38:47
面试题一:判断对象是否已死 判断对象是否已死就是找出哪些对象是已经死掉的,以后不会再用到的,就像地上有废纸、饮料瓶和百元大钞,扫地前要先判断出地上废纸和饮料瓶是垃圾,百元大钞不是垃圾。判断对象是否已死有引用计数算法和可达性分析算法。 1.引用计数算法 给每一个对象添加一个引用计数器,每当有一个地方引用它时,计数器值加 1;每当有一个地方不再引用它时,计数器值减 1,这样只要计数器的值不为 0,就说明还有地方引用它,它就不是无用的对象。如下图,对象 2 有 1 个引用,它的引用计数器值为 1,对象 1有两个地方引用,它的引用计数器值为 2 。 这种方法看起来非常简单,但目前许多主流的虚拟机都没有选用这种算法来管理内存,原因就是当某些对象之间互相引用时,无法判断出这些对象是否已死,如下图,对象 1 和对象 2 都没有被堆外的变量引用,而是被对方互相引用,这时他们虽然没有用处了,但是引用计数器的值仍然是 1,无法判断他们是死对象,垃圾回收器也就无法回收。 2.可达性分析算法 了解可达性分析算法之前先了解一个概念——GC Roots,垃圾收集的起点,可以作为 GC Roots 的有虚拟机栈中本地变量表中引用的对象、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中 JNI(Native 方法)引用的对象。 当一个对象到 GC Roots 没有任何引用链相连(GC Roots

JVM内存模型

我们两清 提交于 2020-02-11 14:42:45
对于Java开发人员来说,了解Java内存模型是必不可少的知识。 JVM内存模型 在生产环境上一般会配置JVM参数以充分利用硬件资源,不管是在云主机或容器里面,也就是在启动应用时添加下面的某些配置: -XmsSetting —初始堆大小 -XmxSetting —最大堆大小 -XX:NewSizeSetting —新一代堆大小 -XX:MaxNewSizeSetting —最大新一代堆大小 -XX:MaxPermGenSetting —永久生成的最大大小 -XX:SurvivorRatioSetting —新的堆大小比率(例如,如果Young Gen大小为10m并且内存开关为–XX:SurvivorRatio=2,则将为Eden空间保留5m,为两个Survivor空间分别保留2.5m,默认值= 8) -XX:NewRatio —提供新旧大小的比率(默认值= 2) 就像任何其他软件一样,JVM占用主机OS内存上的可用空间。 在JVM内部存在单独的内存空间(堆、非堆和缓存),用来存储运行时数据和编译后的代码。 堆内存 堆分为两部分:年轻一代(Young Generation)和老一代(Old Generation) JVM启动时分配堆(初始大小:-Xms) 应用程序运行时堆大小增加/减少 最大大小:-Xmx 世代假设(Generational Hypothesis)

JVM常见问题

假如想象 提交于 2020-02-11 10:42:04
在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了。 那么,请大家尝试着回答一下以下问题: 1、JVM管理的内存结构是怎样的? 2、不同的虚拟机在实现运行时内存的时候有什么区别? 3、运行时数据区中哪些区域是线程共享的?哪些是独享的? 4、除了JVM运行时内存以外,还有什么区域可以用吗? 5、堆和栈的区别是什么? 6、Java中的数组是存储在堆上还是栈上的? 7、Java中的对象创建有多少种方式? 8、Java中对象创建的过程是怎么样的? 9、Java中的对象一定在堆上分配内存吗? 10、如何获取堆和栈的dump文件?以上10道题,如果您可以全部准确无误的回答的话,那说明你真的很了解JVM的内存结构以及内存分配相关的知识了,如果有哪些知识点是不了解的,那么本文正好可以帮你答疑解惑。 Q1:JVM管理的内存结构是怎样的? Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。《Java虚拟机规范》中规定了JVM所管理的内存需要包括一下几个运行时区域: Java虚拟机运行时数据区域主要包含了PC寄存器(程序计数器)、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 各个区域有各自不同的作用,关于各个区域的作用就不在本文中相信介绍了。 但是,需要注意的是,上面的区域划分只是逻辑区域

JVM的调优(六)

二次信任 提交于 2020-02-10 22:11:07
在之前的博客中涉及到了JVM的调优,本文针对JVM的调优做一个简单的小结。 1.JVM的调优参数 1.1 JVM三大性能调优参数 -Xss:规定了每个线程虚拟机(堆栈)的大小 -Xms:堆的初始值 -Xmx:堆能达到的最大值 1.2 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。 如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 - XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值 。 注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 -XX:MaxPermSize=n:设置持久代大小 1.3 收集器设置 -XX:+UseSerialGC:设置串行收集器 -XX:+UseParallelGC:设置并行收集器 -XX:+UseParalledlOldGC:设置并行年老代收集器,这个是JAVA 6出现的参数选项 -XX:+UseConcMarkSweepGC:设置并发收集器 1.4 垃圾回收统计信息 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename 1

JVM 垃圾收集器CMS相关参数

℡╲_俬逩灬. 提交于 2020-02-10 20:21:23
CMS相关参数 -XX:+UseConcMarkSweepGC 使用CMS内存收集 测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明.所以,此时年轻代大小最好用-Xmn设置.??? -XX:+AggressiveHeap 试图是使用大量的物理内存 长时间大内存使用的优化,能检查计算资源(内存, 处理器数量) 至少需要256MB内存 大量的CPU/内存, (在1.4.1在4CPU的机器上已经显示有提升) -XX:CMSFullGCsBeforeCompaction 多少次后进行内存压缩 由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生"碎片",使得运行效率降低.此值设置运行多少次GC以后对内存空间进行压缩,整理. -XX:+CMSParallelRemarkEnabled 降低标记停顿 -XX+UseCMSCompactAtFullCollection 在FULL GC的时候, 对年老代的压缩 CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。 可能会影响性能,但是可以消除碎片 -XX:+UseCMSInitiatingOccupancyOnly 使用手动定义初始化定义开始CMS收集 禁止hostspot自行触发CMS GC -XX

how does jvm enter in public static void main?

淺唱寂寞╮ 提交于 2020-02-10 17:49:51
问题 How can jvm enter in default class: class try1 { public static void main(String args[]) { ... } } In it how does JVM access this method? In packages, if a class is 'default' its public methods cant be accessed from outside the package, so how does jvm enter this class? 回答1: It is not JVM itself who invokes main method. This is rather a job of Java launcher, i.e. java.exe . Java launcher is a small program written in C that uses regular JNI functions: JNI_CreateJavaVM to create a new instance

JVM学习笔记三:JVM堆内存调优(初步)

社会主义新天地 提交于 2020-02-10 17:25:51
永久代大小 在Java8中,永久代已经被移除,被一个称为元空间的区域所取代。元空间的本质和永久代类似。 元空间与永久代之间最大的区别在于: 永久带使用的JVM的堆内存,但是java8以后的元空间并不在虚拟机中而是 使用本机物理内存 。 因此,默认情况下, 元空间的大小仅受本地内存限制 。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由MaxPermSize 控制, 而由系统的实际可用空间来控制。 java7 -XX:PermSize:永久代空间 -XX:MaxPermSize:最大永久代空间 java8 最常用的三个参数: 默认的情况下,jvm分配的内存是总内存的“ 1 / 4 ”、而初始化的内存为“ 1 / 64 ” 在idea中,可以通过Run Configurations里面的VM arguments设置一个或多个参数: 一般来说,初始内存和最大内存要设置成相等的值。防止jvm内存不稳定。 若将jvm内存设置很小,就容易造成OOM:heap space的错误 如:设置VM参数:-Xms8m -Xmx8m -XX:+PrintGCDetails 写一个死循环一直生成大对象,gc回收跟不上new对象的速度。 String str = “hello” ; while(true) { str += str +