垃圾收集(Garbage Collection ,GC),是一个长久以来就被思考的问题,当考虑GC的时候,我们必须思考3件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 那么在Java中,我们要怎么来考虑GC呢?首先回想以下内存区域的划分,其中程序计数器.本地方法栈.虚拟机栈三个区域随线程而生,随线程释放,栈中的栈帧随着方法的进入和退出执行着出栈和入栈的操作,每一个栈帧分配多少内存基本是在类结构确定时就已经固定的(可能会进行一些优化,但是大体上已知),因此这几个区域就不需要考虑回收的问题…
Java类加载器算是一个老生常谈的问题,大多Java工程师也都对其中的知识点倒背如流,最近在看源码的时候发现有一些细节的地方理解还是比较模糊,正好写一篇文章梳理一下. 关于Java类加载器的知识,网上一搜一大片,我自己也看过很多文档,博客.资料虽然很多,但还是希望通过本文尽量写出一些自己的理解,自己的东西.如果只是重复别人写的内容那就失去写作的意义了. 类加载器结构 名称解释: 根类加载器,也叫引导类加载器.启动类加载器.由于它不属于Java类库,这里就不说它对应的类名了,很多人喜欢称Boots…
目录 1. 基本概念 2. 线程的创建和启动 2.1. 多线程实现的原理 2.2.多线程的创建,方式一:继承于Thread类 2.3.多线程的创建,方式一:创建Thread匿名子类(也属于方法一) 2.4. 多线程的创建,方式二:实现Runnable接口 2.4.1. 比较创建线程的两种方式 2.5. 多线程的创建,方式三:实现Callable接口 2.6. 多线程的创建,方式四:线程池 3. Thread类的常用方法 4. 线程的调度 4.1. cpu的调度策略 4.2. Java的调度算法:…
说到Java反射,必须先把 Java 的字节码搞明白了,也就是 Class , 大 Class 在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息,还不太明白Java的大Class的,可以先看一下之前的文章 一篇文章彻底搞懂Java的大Class到底是什么 先想一个问题 1. 给我们一个类,我们如何使用? 这还不简单,通过这个类,创建一个类的对象,再通过这个对象,调用类的方法或者属性 比如有一个类叫 Student , 里面有一个 name字段…
GC机制的一些总结 https://blog.csdn.net/super_qing_/article/details/85263991 https://blog.csdn.net/yhyr_ycy/article/details/52566105 https://www.cnblogs.com/study-makes-me-happy/articles/7827107.html http://www.importnew.com/13493.html…
Class<?> cls = Class.forName("cn.mldn.demo.Person"); // 取得Class对象传入一个包名+类名的字符串就可以得到Class对象 第一步:获得对象,构造方法,普通方法,属性 Object obj = cls.newInstance() //反射实例化对象 Constructor<?> cons = cls.getConstructor(String.class, int.class);//获得构造方法 Meth…
①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是说类的静态成员,静态成员就是static修饰的那种,是"根"的一个,根还包含方法中的成员变量.仅仅有成员或对象不挂在根上,GC的时候就可能把他们搞掉,这里提到的循环引用,就看这个循环引用是否挂在根上,假设挂在根上.假设这个根还被JVM的Java代码所运行的话,就不会GC掉,假设说这个根已经被释放掉了.这个对象不挂在跟上了.那个这个对象就会被GC掉. ②说一下根搜索算法,ROOTS,这个算法,…
在删除文件前调用System.gc()方法,也就是垃圾回收机制,即可成功删除被JAVA虚拟机占用的文件.…
一.前言 长久以来,一直想剖析一下Java线程安全的本质,但是苦于有些微观的点想不明白,便搁置了下来,前段时间慢慢想明白了,便把所有的点串联起来,趁着思路清晰,整理成这样一篇文章. 二.导读 1.为什么有多线程? 2.线程安全描述的本质问题是什么? 3.Java内存模型(JMM)数据可见性问题.指令重排序.内存屏障 三.揭晓答案 1.为什么有多线程 谈到多线程,我们很容易与高性能画上等号,但是并非如此,举个简单的例子,从1加到100,用四个线程计算不一定比一个线程来得快.因为线程的创建和上下文切…
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 以下就是我们常见的问题了: 1. 为什么我们不能直接调用run()方法呢? 我的理解是:线程的运行需要本地操作系统的支持. 如果你查看start的源代码的时候,会发现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public synchronized void start() {         /**      * This method is not…