Да, они копируются, поэтому вы должны объявить переменную как окончательную. Таким образом, они гарантированно не изменятся после того, как копия будет сделана.
Это отличается для экземпляров полей, которые доступны, даже если не окончательные. В этом случае внутренний класс получает ссылку на внешний экземпляр, который он использует для этой цели.
private Environment env; // a field does not have to be final
public void init() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
Во-вторых, возникают ли какие-либо проблемы с производительностью, возникающие при этом?
По сравнению с чем? Вам нужно иметь поле или переменную вокруг, чтобы ваш внутренний класс работал, и копия является очень эффективным способом. В любом случае, это только «мелкая» копия: копируется только ссылка на (в вашем примере) Среде, а не сама Среда.