1. 多线程并发访问一个静态方法(static method)会不会有什么性能影响?

  思考:不会,原因是static method编译后及时一串指令(jvm中的静态方法区,也叫non-heap(包含了Perm Gen),jvm规范对该区没有GC 要求);

     如果没有数据竞争,就不会有并发不安全的问题。

       那个数据调用了改方法,则对改数据做一系列的指令。

2.所谓的minor GC ,full GC 和常见的内存溢出,你的理解是什么?

  思考:jvm 内存模型分几大区域:栈(线程)、堆(实例)、静态方法区(class,method等),

    GC 都是发生在堆内存(heap),堆中分为一个Eden、两个survivor、一个Tunured;清空Eden叫minor GC,清空Tenured叫full GC ,suvivor完成数据的交换。

    内存溢出在可以发生在任何区域

    栈帧溢出:StackOverflowError:Thrown when a stack overflow occurs because an application recurses too deeply.(-Xss 2048K 可以调整每个线程的栈内存容量)

    堆溢出:OutOfMemoryError:Java heap space (调整参数为-Xms128m -Xmx521m)

    静态方法栈溢出:OutOfMemoryError:PermGen space (调整参数为: -XX:PermSize=256m -XX:MaxPermSize=512m)

3.关于static、final、static final修饰的变量 你有什么理解?

  static 和 final 修饰的变量:在 Perm Gen(方法区)中。

  而static final两个修饰符同时修饰的变量 并不在此区域中。

  验证代码和现象如下:

package demo;

public class Test {

    public static void main(String[] args) {
try {
Thread.sleep(10*1000);
System.out.println(ConstA.str10000);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10001);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10002);// 无明显变化
Thread.sleep(10*1000);
System.out.println(ConstC.str10000);//无明显变化
Thread.sleep(10*1000);
} catch (Exception e) {
e.printStackTrace();
}
} }

    

这个例子有些值得思考的地方:比如static final为何没有出现在PermGen中,我去查阅了有关资料,说static final是编译期常量,不会引发类的初始化。(http://www.cnblogs.com/jxzheng/p/5191037.html)

于是,我在test中加了一行代码:Class.forName()

  

package demo;

public class Test {

    public static void main(String[] args) {
try {
Thread.sleep(10*1000);
System.out.println(ConstA.str10000);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10001);// Perm Gen 内存明显增长
Thread.sleep(10*1000);
System.out.println(new ConstB().str10002);// 无明显变化
Thread.sleep(10*1000);
Class.forName("demo.ConstC");
System.out.println(ConstC.str10000);//20秒后,内存开始变化
Thread.sleep(10*1000);
} catch (Exception e) {
e.printStackTrace();
}
} }

  

  

关于java和jvm的思考的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. java之jvm学习笔记十三(jvm基本结构)

    java之jvm学习笔记十三(jvm基本结构) 这一节,主要来学习jvm的基本结构,也就是概述.说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成 ...

  3. java虚拟机 jvm 出入java栈 栈空间内存分配

    java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...

  4. 如果你不了解Java的JVM,那真的很难进BAT一线大厂!

    前言 对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.我们不能为了面试而面试,但是学习会这些核心知识你必定会成为面试 ...

  5. java内功 ---- jvm虚拟机原理总结,侧重于虚拟机类加载执行系统

    参考书籍:<深入理解java虚拟机>,三天时间用了八个小时看完,像读一本武侠小说,挺爽. 另外需声明:图片都是从我自己的csdn博客转载,所以虽然有csdn标识,但都是我自己画的图片. j ...

  6. Java虚拟机JVM学习07 类的卸载机制

    Java虚拟机JVM学习07 类的卸载机制 类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了. 当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就 ...

  7. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  8. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  9. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

随机推荐

  1. VersionControl:git

    关于VersionControl VersionControl即版本控制,版本控制是一种记录文件或文件集随时间变化的系统,以便以后可以查阅调用特定版本,版本控制系统不仅可以应用于软件源代码的文本文件, ...

  2. Nginx的使用(一)Nginx+IIS实现一个网站绑定多个https域名

    使用nginx最初的目的是为了解决iis7下无法配置多个443端口的问题,iis7下不同的域名无法同时绑定443端口,据说iis8是可以的,但是iis8的话需要安装windows server2012 ...

  3. SQL Update 语句详解

    SQL Update 语句详解   Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: L ...

  4. proxy Static方式

    package com.xk.spring.kp04_aop.proxy.s1_static; public interface IStudentService { public void save( ...

  5. bootstrap--------bootstrap table

    bootstrap table 显示行号 <th rowspan="2" data-field="index" data-formatter=" ...

  6. Jsの练习-数组常用方法 -slice()

    slice() 返回从原数组指定开始下标到结束下标之间的项组成的新数组. slice()方法可以接收一个或两个参数,即要返回项的起始和结束位置. 在只有一个参数的情况下,slice()方法返回从该参数 ...

  7. java.io.IOException: Could not delete path 'D:\mycode\reactnative\SecondTest\android\app\build\generated\source\r \release\android\support\v7

    问题解决 直观上看是没有删除某个文件,产生的IOException异常,实际上是因为上次编译导致的缓存没有清空导致的. 进入到android目录下运行下面代码清除上次打包时的缓存: ./gradlew ...

  8. 1.3 解决pip使用异常问题

    1.3 解决pip使用异常问题 1.3.1 pip出现异常有一小部分童鞋在打开cmd输入pip后出现下面情况:Didnot provide a command Did not provide a co ...

  9. Spell checker using hash table

    Problem description Given a text file, show the spell errors from it.  (https://www.andrew.cmu.edu/c ...

  10. 重启HA集群NameNode无缘无故挂掉

    重启HA集群后,两个NameNode无缘无故挂掉,查看日志时显示错误如下: 原因:journalnode的端口是8485,默认情况下是先NameNode启动后再启动journalnode,如果在Nam ...